iPhone: Hur hantera klassanrop mellan views

Tråden skapades och har fått 23 svar. Det senaste inlägget skrevs .
1

Jag kastar ut en fråga...
Jag sitter och pluggar iPhone-utveckling och jag har kört fast... jag håller på att utveckla en dagboksapp i UITableView.
När jag trycker på knappen för att lägga till ett dagboksinlägg vill jag gömma navigationController, hur gör jag det?

Jag har provat att importera den klass som hanterar detta och kört denna:
[diaryAppDelegate hideNavigationBar];

Jag har skapat en sådan funktion, men det hjälpte inte...

Någon som har några idéer?

  • Medlem
  • 2010-08-05 09:17

Vill du inte att "skapa dagboksinlägg" ska vara en modal dialog? Som har en "avbryt" och en "klar"-knapp?

Då kanske du borde visa "skapa dagboksinlägg"-vyn med hjälp av

[self presentModalViewController:controller animated:NO];

Jo det är precis vad jag vill. Den ska vara väsensskild från det övriga vyerna och vara helt egen.

Du får gärna förklara lite mer arc.
Eftersom detta är min andra "riktiga" iPhone-app jag gör så är jag en nybörjare.
Det tog mig 3 timmar igår att fatta att viewDidLoad bara läses första gången och aldrig mer, så du vet vad du har att jobba mot.

  • Medlem
  • 2010-08-05 10:37

Du skapar din vy (view) för dagboksinlägg i InterfaceBuilder. En helt ny *.xib-fil som heter t.ex. CreateNewDiaryView.xib

I den xib-filen har du en View och de gui-element som dagboksinlägget behöver (TextView, DatePicker, mm)

Du skapar sedan en view-controller klass i XCode som du lämpligen döper till CreateNewDiaryViewController. Den klassen ska förstås ärva UIViewController.

I InterfaceBuilder ska du nu ändra så att File's Owner i CreateNewDiaryView.xib blir av typen CreateNewDiaryViewController.

I den vy (låt oss kalla den DiaryViewController) där du har en knapp eller liknande för att skapa ett nytt dagboksinlägg gör du följande:

@implementation DiaryViewController
...
-(IBAction)createNewDiary: (id)sender {
...
CreateNewDiaryViewController *controller = [[CreateNewDiaryViewController alloc] initWithNibName:@CreateNewDiaryView bundle:nil];

[self presentModalViewController:controller animated:NO];
...
}

För att ta bort den modala vyn skall samma vy som skapade den modala dialogen göra följande:

[self dismissModalViewControllerAnimated:NO];

för att lösa det brukar den modala dialogens klass (CreateNewDiaryViewController) ha en pekare till vy som skapade och visade den modala dialogen (DiaryViewController):

@implementation DiaryViewController
...
-(IBAction)createNewDiary: (id)sender {
...
CreateNewDiaryViewController *controller = [[CreateNewDiaryViewController alloc] initWithNibName:@CreateNewDiaryView bundle:nil];

controller.diaryViewController = self;

[self presentModalViewController:controller animated:NO];
...
}

@implementation CreateNewDiaryViewController
...
-(IBAction)cancel: (id)sender {
...
[diaryViewController dismissModalViewControllerAnimated:NO];
...
}

Allt är kanske inte 100% korrekt eftersom det bara är fragment av kod men förhoppningsvis förstår du hur man gör. Jag kan ju inte heller svära på att det här är det optimala sättet att lösa det på.

Tack!
Otroligt vilken bra hjälp - jag är själv på samma spår men de delar som saknades tror jag finns med i det du skrev!

Så tack igen!
Jag rapporterar senare ikväll hur det går.

Jodå det funkade bara fint tack Arc!

Nästan ska jag säga... jag lyckas inte "döda" den vy jag skapat, erkänner att jag är jäkligt trött och hjärnan ser nog inte vad jag ska göra.
Jag har så att UIButtonItem knapparna triggar på Cancel och Save.

Men vad jag ska göra under Cancel och Save är mer vad min hjärna fixar nu.
Jag gör nya försök imorgon, jag kan alltid hoppas på arc eller nån som hjälper mig.

  • Medlem
  • Stockholm
  • 2010-08-06 07:41
Ursprungligen av Mattias Hedman:

Nästan ska jag säga... jag lyckas inte "döda" den vy jag skapat, erkänner att jag är jäkligt trött och hjärnan ser nog inte vad jag ska göra.
Jag har så att UIButtonItem knapparna triggar på Cancel och Save.

Men vad jag ska göra under Cancel och Save är mer vad min hjärna fixar nu.
Jag gör nya försök imorgon, jag kan alltid hoppas på arc eller nån som hjälper mig.

[controller release]; ???

Vänligen, Ylan

Jo jag vet men den där grr %€/&€/&€€&/ pekaren får jag inte till.
Alltså controller.

Jag jobbar som en guldfisk nu kommer inte ihåg vad jag gjorde i sekunden innan känns det som.
Snart sätt paniken in.

Såja nu är paniken inne i mig...

Jag är på sista steget och får inte till det.
Jag ska från min secondView anropa en metod i RootView men det verkar jag inte få.
I secondView.m har jag detta:
RootViewController *rootViewController = [[RootViewController alloc] init];
[self.rootViewController addDiaryEntry:userInputs];

Men detta ger error:
accessing unknown 'rootViewController' getter method

Vafalls?
Metoden är deklareread i RootViews -h fil.

Hilfe!

Jag fick fullkomligt ovärderlig hjälp av Ylan, tack så otroligt mycket!
Utan dig blev uppgiften nästan klar och det hela kändes bara som ett misslyckade istället för en total krasch och hjärnsmälta.

Så tack igen Ylan men även Arc ska ha sig en slev av det goda.

  • Medlem
  • Mölndal
  • 2010-08-09 19:00

Du menar tvärtom antar jag? Eftersom ylan skrev en enda rad och arc typ 30.

Ylan hjälpte mig mer än via forumet, via Skype också. Därav allt tack till honom.
Men för den delen har jag inte glömt Arc som gjorde att jag kom igång med en vital del av uppgiften tack var honom.

Jag får återuppväcka denna tråd och hoppas på hjälp. Jag sitter med samma app igen och håller på att rätta den för att få den godkänd. Jag har en minnesläcka och två varningar jag måste fixa.

Minnesläckan finns beskriven här:
Can't figure out why this is a memory leak, please advice! - Stack Overflow

Varningarna får jag ta mig en titt på imorgon.

  • Medlem
  • Stockholm
  • 2010-08-11 00:32
Ursprungligen av Mattias Hedman:

Jag får återuppväcka denna tråd och hoppas på hjälp. Jag sitter med samma app igen och håller på att rätta den för att få den godkänd. Jag har en minnesläcka och två varningar jag måste fixa.

Minnesläckan finns beskriven här:
Can't figure out why this is a memory leak, please advice! - Stack Overflow

Varningarna får jag ta mig en titt på imorgon.

Såg att du fått svar! Eftersom du skapar objektet är du ansvarig för att lämna tillbaka minnet till systemet efteråt. Därför finns autorelease!

Vänligen, Ylan

  • Medlem
  • Mölndal
  • 2010-08-11 02:55

Jag har inte riktigt hängt med, men hade inte Obc-C äntligen blivit ett modernt språk och fått garbage collection det med?

@memakr: Jodå Garbage Collection finns för Obj-C i Mac OS X, men inte på iPhone.

@ylan: Du sån nybörjare är jag inte. Men jag kör autorelease på objektet men den verkar inte "ta".
Eller uppstår minnesläckan innan applikationen hunnit med sin cykel?
Jag har provat att release [formatter release] men det gjorde ingen skillnad.

  • Medlem
  • Söderfors
  • 2010-08-11 08:06

Garbage collection stöds tyvärr inte av iOS...

Då har jag byggt om hela systemet kring datumformattering. Av någon anledning använder jag de inbyggda funktionerna i NSDateFormatter direkt. Funkar fin fint. Upptäckte att den klass jag anropar inte funkar så bra som jag hoppats så jag dödade den. Mindre kod, mer förstålig kod. Men det skedde efter 00.00.

Nåja rättningen går bra... lite för bra kanske, för nu startar inte appen... hehe

2010-08-11 08:26:58.464 Diary[7928:207] diaryEntry: <Diary: 0x5b5d9b0> (entity: Diary; id: 0x5b5d030 <x-coredata://FC55A0B9-8F96-4DC5-BA10-11EA09C6E20C/Diary/p6> ; data: <fault>)
2010-08-11 08:26:58.468 Diary[7928:207] diaryEntry: <Diary: 0x5b5dc30> (entity: Diary; id: 0x5b5d040 <x-coredata://FC55A0B9-8F96-4DC5-BA10-11EA09C6E20C/Diary/p5> ; data: <fault>)

Hjälp!

// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
	
	// A date formatter for the time stamp static 
	
	NSString *CellIdentifier = @Cell;
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
	
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];
    }

	Diary *diaryEntry = (Diary *)[diaryArray objectAtIndex:indexPath.row];
    NSLog(@"diaryEntry: %@", diaryEntry);
	
	cell.textLabel.text = diaryEntry.diaryTitle;
/*	
	//Konvertera NSDate till NSString
	NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
	[formatter setDateFormat:@"yyyy-MM-dd HH:mm"];
	NSString *stringDate = [formatter stringFromDate:[diaryEntry diaryDate]];
	[formatter release];
	
	cell.detailTextLabel.text = stringDate;    
	[stringDate release];
*/	
	return cell;
}

Denna metod får hela appen att krasha, om jag kommenterar ut det jag kommenterat ut så fungerar den. Men Console output ser ut så här:

[Session started at 2010-08-11 14:50:35 +0200.]
2010-08-11 14:50:37.153 Diary[10187:207] diaryEntry: <Diary: 0x7052e20> (entity: Diary; id: 0x70524a0 <x-coredata://FC55A0B9-8F96-4DC5-BA10-11EA09C6E20C/Diary/p6> ; data: <fault>)
2010-08-11 14:50:37.156 Diary[10187:207] diaryEntry: <Diary: 0x70530a0> (entity: Diary; id: 0x70524b0 <x-coredata://FC55A0B9-8F96-4DC5-BA10-11EA09C6E20C/Diary/p5> ; data: <fault>)
2010-08-11 14:51:01.296 Diary[10187:207] save
2010-08-11 14:51:01.297 Diary[10187:207] title: Titel4, context: Dagbokstext4
2010-08-11 14:51:01.298 Diary[10187:207] Inkommande array: (
    Titel4,
    Dagbokstext4
)
2010-08-11 14:51:01.305 Diary[10187:207] diaryEntry: <Diary: 0x5b81e70> (entity: Diary; id: 0x5b44540 <x-coredata://FC55A0B9-8F96-4DC5-BA10-11EA09C6E20C/Diary/p7> ; data: {
    diaryContext = Dagbokstext4;
    diaryDate = "2010-08-11 14:51:01 +0200";
    diaryTitle = Titel4;
})

Det verkar ha något att göra med när jag startar första gången... jag försöker lösa det men jag kanske kan få snabbare hjälp här.

Programmet går genom metoden tre ggr innan något visas på skärmen.
Varje gång den går genom metoden produceras detta fel:

2010-08-11 14:59:45.447 Diary[10308:207] diaryEntry: <Diary: 0x5b47d20> (entity: Diary; id: 0x5b473a0 <x-coredata://FC55A0B9-8F96-4DC5-BA10-11EA09C6E20C/Diary/p7> ; data: <fault>)

Plöstligt blev jag väldigt trött... tror jag måste vila mig lite...

Nu är nästan allt löst... men en sak återstår.
Det har att göra med instance variabler är jag rätt säker på, jag har lagt en fråga på stackoverflow så ni kan läsa mer där.

DetailView empty on first click from UITableView - Stack Overflow

Nu är allt klart och appen fungerar som den ska utan minnesläckor och varningar.

Tack Ylan igen!

1
Bevaka tråden