Ich versuche, eine UI programmgesteuert zu erstellen. Mein Problem ist, dass die View Controller Subviews nicht angezeigt werden.Unteransichten für einen UIViewController werden nicht angezeigt
Hier ist, wie ich die Benutzeroberfläche zu erstellen versuchen:
.h
#import <UIKit/UIKit.h>
@protocol TimerCreatorDelegate <NSObject>
- (void)timerCreatorControllerDismissedWithString:(NSString *)timerName andTimeInterval:(NSTimeInterval)timeInterval;
@end
@interface TimerCreatorController : UIViewController {
// id timerCreatorDelegate;
}
@property (nonatomic, assign) id<TimerCreatorDelegate> timerCreatorDelegate;
@property (weak, nonatomic) UIDatePicker *timerLength;
@property (weak, nonatomic) UITextField *timerNameTextField;
@property (weak, nonatomic) UIButton *createTimerButton;
//@property (weak, nonatomic) IBOutlet UIDatePicker *timerLength;
//@property (weak, nonatomic) IBOutlet UITextField *timerNameTextField;
- (IBAction)createTimer:(id)sender;
@end
.m
#import "TimerCreatorController.h"
@interface TimerCreatorController()
@end
@implementation TimerCreatorController
@synthesize timerCreatorDelegate;
@synthesize timerNameTextField;
@synthesize timerLength;
@synthesize createTimerButton;
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor grayColor];
timerNameTextField.placeholder = @"This timer is for:";
timerLength.datePickerMode = UIDatePickerModeCountDownTimer;
[createTimerButton setTitle:@"Start Timer" forState:UIControlStateNormal];
[createTimerButton setTitleColor:[UIColor colorWithRed:46/255 green:134/255 blue:53/255 alpha:1] forState:UIControlStateNormal];
createTimerButton.titleLabel.font = [UIFont fontWithName:@"HelveticaNeue-Light" size:20];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
/*
#pragma mark - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
// Get the new view controller using [segue destinationViewController].
// Pass the selected object to the new view controller.
}
*/
- (void)viewWillLayoutSubviews {
printf("viewWillLayoutSubviews Called.\n\n");
[self.view addSubview:timerLength];
[self.view addSubview:timerNameTextField];
[self.view addSubview:createTimerButton];
timerLength.translatesAutoresizingMaskIntoConstraints = false;
timerNameTextField.translatesAutoresizingMaskIntoConstraints = false;
createTimerButton.translatesAutoresizingMaskIntoConstraints = false;
timerLength.frame = CGRectMake(0, 0, self.view.frame.size.width, 216);
timerNameTextField.frame = CGRectMake((self.view.frame.size.width - 300)/2, timerLength.frame.size.height + 40, 300, 30);
createTimerButton.frame = CGRectMake((self.view.frame.size.width - 96)/2, timerNameTextField.frame.origin.y - 40, 96, 36);
[NSLayoutConstraint activateConstraints:[NSArray arrayWithObjects:
[timerLength.topAnchor constraintEqualToAnchor:self.view.topAnchor],
[timerLength.leftAnchor constraintEqualToAnchor:self.view.leftAnchor],
[timerLength.rightAnchor constraintEqualToAnchor:self.view.rightAnchor],
[timerLength.centerXAnchor constraintEqualToAnchor:self.view.centerXAnchor],
[timerNameTextField.topAnchor constraintEqualToAnchor:timerLength.bottomAnchor],
[timerNameTextField.rightAnchor constraintEqualToAnchor:self.view.rightAnchor constant:-37],
[timerNameTextField.leftAnchor constraintEqualToAnchor:self.view.leftAnchor constant:37],
// [timerNameTextField.heightAnchor constraintEqualToAnchor:NSLayoutAttributeNotAnAttribute constant:30],
[createTimerButton.centerXAnchor constraintEqualToAnchor:self.view.centerXAnchor],
// [createTimerButton.widthAnchor constraintEqualToAnchor:NSLayoutAttributeNotAnAttribute constant:96],
// [createTimerButton.heightAnchor constraintEqualToAnchor:NSLayoutAttributeNotAnAttribute constant:36],
[createTimerButton.topAnchor constraintEqualToAnchor:timerNameTextField.bottomAnchor]
#warning Finish Layout Constraints
, nil]];
NSString *timerLengthString = [NSString stringWithFormat:@"%@", NSStringFromCGRect(timerLength.frame)];
NSString *timerNameTextFieldString = [NSString stringWithFormat:@"%@", NSStringFromCGRect(timerNameTextField.frame)];
NSString *createTimerButtonString = [NSString stringWithFormat:@"%@", NSStringFromCGRect(createTimerButton.frame)];
printf("timerLength: %s \n", [timerLengthString UTF8String]);
printf("timerNameTextFieldString: %s \n", [timerNameTextFieldString UTF8String]);
printf("createTimerButtonString: %s \n", [createTimerButtonString UTF8String]);
}
- (IBAction)createTimer:(id)sender {
if ([self.timerCreatorDelegate respondsToSelector:@selector(timerCreatorControllerDismissedWithString:andTimeInterval:)]) {
[self.timerCreatorDelegate timerCreatorControllerDismissedWithString:timerNameTextField.text andTimeInterval:timerLength.countDownDuration];
}
[self dismissViewControllerAnimated:true completion:nil];
}
@end
Trotz mir den Rahmen meiner Ansichten Einstellung, die Drucke zeigen Frames von 0 an.
Wo erstellen Sie die Unteransichten? Ich sehe, dass Sie versuchen, sie zu verwenden, aber nicht dort, wo Sie tatsächlich die Objekte erstellen, die Sie verwenden. Ist es eine NIB-Datei oder machen Sie eigentlich alles programmgesteuert? Und warum sind deine Subviews "schwache" Referenzen? Wenn sie von nichts anderem Hilfe bekommen, werden sie freigegeben, nachdem sie erstellt wurden ... – Putz1103
@ Putz1103, das hat mein Problem gelöst. Ich versuche, sie nur programmatisch zu erstellen. Dein Kommentar hat mir klar gemacht, dass ich vergessen habe zu initialisieren! PEBKAC. Ich habe die Referenzen auch auf stark geändert. Ich würde sagen, posten Sie die Antwort. –
Warum im Namen des Himmels würden Sie alles programmatisch erstellen? Es ist viel mehr Arbeit, gibt Ihnen nicht viele Funktionen wie Container Ansichten, Tabellenansicht Vorlagen, etc, etc, etc, und ist viel schwieriger zu pflegen als Storyboard/Nib-basierte UI-Design. Der einzige Grund, warum ich es so sehen kann, ist eine Lernübung. Wenn ich ein Einstellungsmanager wäre, der jemanden für einen Job interviewt und sie sagten, dass sie alle ihre UI über Code abarbeiten würden, wäre meine Antwort "Weiter!" –