11

Właściwość parentViewController kontrolera UIViewConnor jest tylko do odczytu, ale zagnieżdżam niestandardowe kontrolery widoku i chcę użyć tej właściwości.Jak ustawić parentViewController w UIViewController?

Jednak ponieważ jest to plik tylko do odczytu i nie znalazłem innego sposobu ustawienia tej właściwości, moim pytaniem jest: jak ustawić do Ustawiłem?

Oczywiście, UINavigationController może ustawić właściwość jakoś w -pushViewController, a więc może -presentModalViewController, więc musi być możliwe.

Jestem świadomy, że mogę po prostu dodać własną właściwość UIViewController, ale jestem pewien, że parentViewController jest, w zasadzie, właściwą właściwością.

+0

Myślę, że każdy, kto zagłosuje na każdą odpowiedź w tym wątku, mógł podać powód: – willcodejavaforfood

+0

To nie byłem ja, ale podejrzewam, że nie zgadzają się z używaniem prywatnych interfejsów API i wydaje się, że porady dotyczące korzystania z prywatnych interfejsów API często na SO. Może to mole jabłkowe. –

Odpowiedz

1

Jednak ponieważ jest to plik tylko do odczytu i nie znalazłem innej możliwości ustawienia tej właściwości, moje pytanie brzmi: jak to ustawić?

Jeśli jest to readonly, nie można używać notacji kropek bez uzyskania compiler error.

Można jednak użyć metody categories, aby dodać niestandardową metodę modifyParentViewController do klasy UIViewController.

Nawet jeśli własność jest tylko do odczytu, sama zmienna może być modyfikowalna, jeśli nie jest @protected. Jeśli jest to @protected, podklasy kontrolera widoku mogą pozwolić ci na modyfikację zmiennej.

+0

To jest trochę zbyt brudne jak na mój gust, ale domyślam się, że gdybym nalegał na użycie parentViewController, byłby to jedyny możliwy sposób.
Użyję jednak niestandardowego obiektu UIViewController. – mrueg

0

parentViewController jest dla celów NavigationViewControllers i prezentacji modalnych kontrolerów widoku, nie ma możliwości ustawienia właściwości bez użycia metod push pushController lub presentModalViewController. ParentViewController jest właściwością tylko do odczytu, którą można odczytać tylko przez klasę UIViewController i klasę UINavigationController, podklasy tych nie będą miały dostępu do ustawiania właściwości.

2

Próbowałem sugestii Alexa kupując kategorię dla UIViewController i działało w symulatorze, ale nie na moim telefonie. tutaj jest kategoria

@interface UIViewController (parentSetter) 
-(void)setParentUIViewController:(UIViewController*)parent; 
@end 

@implementation UIViewController (parentSetter) 
-(void)setParentUIViewController:(UIViewController*)parent 
{ 
_parentViewController = parent; 
} 
@end 

Kompiluje się i działa dobrze, ale zwróć uwagę na element podkreślenia, który jest nieco odkładany. To powoduje błąd linkera podczas kompilacji z pakietem SDK 3.0.

Mam widok kontenera, który ma 2 subviews, a tabela jest jednym z nich. Tabela potrzebuje rodzica, aby między innymi móc wchodzić w interakcję z paskiem nawigacyjnym.

Idę z tego rozwiązania zamiast:

@interface AdoptedTableViewController : UITableViewController { 
    UIViewController* surrogateParent; 
} 

-(UINavigationController*)navigationController; 
@property (nonatomic, assign) IBOutlet UIViewController *surrogateParent; 
@end 

@implementation AdoptedTableViewController 
@synthesize surrogateParent; 

-(UINavigationController*)navigationController 
{ 
    if([super navigationController])//self.navigationController) 
    { 
     return [super navigationController]; 
    } 
    else 
    { 
     return surrogateParent.navigationController; 
    } 
} 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    [tableView deselectRowAtIndexPath:indexPath animated:YES]; 
} 

Wszystkie moje Table View kontrolerów są teraz adoptedTableViewControllers. Głównym powodem, dla którego potrzebują oni rodziców, jest możliwość przesyłania kontrolerów widoku na stos nawigacyjny, dzięki czemu jest on obsługiwany w sposób przezroczysty przez moduł pobierania kontrolera nawigacyjnego.

Byłoby miło, gdyby parentViewController nie były tylko do odczytu, ale w moim chwalić z _parentViewController odkryłem, że jest więcej do hierarchii ViewController niż tylko tej właściwości. Myślę, że w tej relacji może być wiele sprzężeń i obowiązków, których Apple nie posprzątało wystarczająco dla mas. Na przykład zauważyłem dziwne zachowanie cofnięcia wyboru podczas przechodzenia w górę hierarchii nawigacji, której nie mogłem naprawić.Być może kontrolery UINavigation odzwierciedlają klasę swojego top kontrolera i zachowują się inaczej?

W skrócie, jest to naprawdę tylko do odczytu i nie ma czystego ani prostego rozwiązania. Po prostu masz wokół architekta.

0

Wygląda na to, że wywołanie metody setParentViewController: działa.

[childViewController setParentViewController:self]; 

Jednak nadal generuje ostrzeżenie kompilatora. Które, IMO, oznacza, że ​​tego nie robisz (zamiast tego podklasowałem).

11

Rozwiązanie to:

- (void)setParentController:(UIViewController*)parent{ 
[self setValue:parent forKey:@"_parentViewController"]; 
    } 

Nie powoduje problemy z łącznikiem!

PS: Nie używaj „setParentViewController” jako nazwy metody, ponieważ metoda ta istnieje w prywatnej API i Apple powiedzieć: „API niepublicznych, które są zawarte w aplikacji jest setParentViewController :.

Jeśli w kodzie źródłowym zdefiniowano metodę o tej samej nazwie, co wyżej wymieniony interfejs API, sugerujemy zmianę nazwy metody, aby nie kolidowała ona już z prywatnym interfejsem API Apple, aby uniknąć oznaczania aplikacji przyszłymi zgłoszeniami.

Proszę rozwiąż ten problem podczas następnej aktualizacji ... "

+2

Czy nie spowoduje to odrzucenia App Store? To rozwiązuje niektóre z moich problemów z prezentacją modalną, ale jest przerażające. –

9

Rozumiem, że to pytanie zostało zadane przed iOS 5, ale dla odniesienia, powinieneś użyć addChildViewController kiedy chcesz zagnieżdżać UIViewControllers. Spowoduje to również automatyczne ustawienie właściwości parentViewController.

- (void)addChildViewController:(UIViewController *)childController NS_AVAILABLE_IOS(5_0); 

można przeczytać więcej na temat „Tworzenie własnych Treści kontrolerów” na Apple.

+1

To działa dla mnie, ustawia właściwość parentViewController na podrzędnym kontroler widoku. Nie wiem, dlaczego nie jest to zaakceptowana odpowiedź. – KyleStew