Ich bin mir bewusst, dass diese Frage schon einmal gestellt wurde, aber die Antworten sind widersprüchlich und ich bin verwirrt. Bitte flammen Sie mich nicht an.
Ich möchte eine wiederverwendbare UIView
Unterklasse in meiner App haben. Ich möchte die Schnittstelle mit einer NIB-Datei beschreiben.
Angenommen, es handelt sich um eine Ladeanzeige mit einem Aktivitätsindikator. Ich möchte in einem bestimmten Fall diese Ansicht instanziieren und in die Ansicht eines Ansichtscontrollers animieren. Ich könnte die Benutzeroberfläche der Ansicht problemlos programmgesteuert beschreiben, die Elemente programmgesteuert erstellen und ihren Frame innerhalb einer Init-Methode usw. festlegen.
Wie kann ich das mit einer Feder machen? Beibehalten der im Interface Builder angegebenen Größe, ohne einen Frame festlegen zu müssen.
Ich habe es so gemacht, aber ich bin mir sicher, dass es falsch ist (es ist nur eine Ansicht mit einem Picker):
- (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;
}
Aber ich überschreibe mich selbst und wenn ich es instanziiere:
FSASelectView *selectView = [[FSASelectView alloc] initWithDataSource:selectViewDictionary];
selectView.delegate = self;
selectView.frame = CGRectMake(0, self.view.bottom + 50, [FSASelectView width], [FSASelectView height]);
Ich muss den Rahmen manuell einstellen, anstatt ihn von IB abholen zu lassen.
BEARBEITEN: Ich möchte diese benutzerdefinierte Ansicht in einem Ansichts-Controller erstellen und Zugriff auf die Elemente der Ansicht haben. Ich möchte keinen neuen View Controller.
Vielen Dank
EDIT: Ich weiß nicht, ob dies die beste Vorgehensweise ist, ich bin mir sicher, dass dies nicht der Fall ist, aber so habe ich es gemacht:
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) {
}];
Richtige Übung noch gewünscht
Sollte dies mit einem View Controller und Init mit dem Nib-Namen geschehen sein? Sollte ich die Schreibfeder in einer UIView-Initialisierungsmethode im Code gesetzt haben? Oder ist das, was ich getan habe, in Ordnung?
initWithDataSource
? Auf jeden Fall funktioniert dies auch dann, wenn Sie den Eigentümer als "Null" angeben.