Zdaję sobie sprawę, że to pytanie zostało już zadane, ale odpowiedzi są sprzeczne i jestem zdezorientowany, więc proszę, nie pal mnie.
Chcę mieć UIView
podklasę wielokrotnego użytku w całej mojej aplikacji. Chcę opisać interfejs za pomocą pliku nib.
Teraz powiedzmy, że jest to widok wskaźnika ładowania ze wskaźnikiem aktywności. Chciałbym na jakimś zdarzeniu utworzyć wystąpienie tego widoku i animować go do widoku kontrolera widoku. Mógłbym opisać interfejs widoku bez problemu programowo, tworząc elementy programowo i ustawiając ich ramkę wewnątrz metody init itp.
Jak mogę to zrobić za pomocą stalówki? Utrzymanie rozmiaru podanego w konstruktorze interfejsu bez konieczności ustawiania ramki.
Udało mi się to zrobić w ten sposób, ale jestem pewien, że jest źle (to tylko widok z selektorem):
- (id)initWithDataSource:(NSDictionary *)dataSource {
self = [super init];
if (self){
self = [[[NSBundle mainBundle] loadNibNamed:[NSString stringWithFormat:@"%@", [self class]] owner:self options:nil] objectAtIndex:0];
self.pickerViewData = dataSource;
[self configurePickerView];
}
return self;
}
Ale nadpisuję siebie, a kiedy go utworzę:
FSASelectView *selectView = [[FSASelectView alloc] initWithDataSource:selectViewDictionary];
selectView.delegate = self;
selectView.frame = CGRectMake(0, self.view.bottom + 50, [FSASelectView width], [FSASelectView height]);
Muszę ręcznie ustawić ramę, zamiast odbierać ją od IB.
EDYCJA: Chcę utworzyć ten niestandardowy widok w kontrolerze widoku i mieć dostęp do sterowania elementami widoku. Nie chcę nowego kontrolera widoku.
Dzięki
EDYCJA: Nie wiem, czy to najlepsza praktyka, na pewno nie, ale tak to zrobiłem:
FSASelectView *selectView = [[[NSBundle mainBundle] loadNibNamed:[NSString stringWithFormat:@"%@",[FSASelectView class]] owner:self options:nil] objectAtIndex:0];
selectView.delegate = self;
[selectView configurePickerViewWithData:ds];
selectView.frame = CGRectMake(0, self.view.bottom + 50, selectView.width, selectView.height);
selectView.alpha = 0.9;
[self.view addSubview:selectView];
[UIView animateWithDuration: 0.25 delay: 0 options:UIViewAnimationOptionAllowUserInteraction |UIViewAnimationOptionCurveEaseInOut animations:^{
selectView.frame = CGRectMake(0, self.view.bottom - selectView.height, selectView.width, selectView.height);
selectView.alpha = 1;
} completion:^(BOOL finished) {
}];
Nadal potrzebna jest właściwa praktyka
Czy powinno to być zrobione przy użyciu kontrolera widoku i inicjalizacji z nazwą końcówki? Czy powinienem ustawić końcówkę w jakiejś metodzie inicjalizacji UIView w kodzie? A może to, co zrobiłem, jest w porządku?
initWithDataSource
? W każdym razie to zadziała, nawet jeśli podasz właściciela jako „Zero”.