我已经实现了一个小的viewDidLoad()来显示具有自动调整功能的图片,但它不起作用,可以请某人帮助我并说出这行代码在第3行和第4行中的错误是什么?
imageView = [[UIImageView alloc] initWithImage:img];
imageView.frame = self.view.frame;
imageView.autoresizingMask = UIViewAutoresizingFlexibleHeight;
imageView.autoresizingMask = UIViewAutoresizingFlexibleWidth;
Run Code Online (Sandbox Code Playgroud)
我希望有人可以帮助我?
可能重复:
[super viewDidLoad]约定
它使一个区别在哪里我把[super viewDidLoad]内viewDidLoad我的UIViewController?即,它应该在开始之前(在我的代码之前设置UIViewController)或者在我的代码之后设置UIViewController),或者它没有任何区别?
我有一个应用程序正在按预期工作.
但是,我在rootViewController的viewDidLoad方法的第一行放了一个断点,在我的委托的didFinishLaunchingWithOptions的第一行放了另一个断点,
令我惊讶的是,应用程序在viewDidLoad方法中输入,然后转到didFinishLaunchingWithOptions,然后再执行一次viewDidLoad方法.
到底是怎么回事?我认为这种行为是完全错误的.
先感谢您!
#编辑这是我的iPad的委托didFinishLaunchingWithOptions方法:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[[UIApplication sharedApplication] setStatusBarHidden:NO];
UtilXML *utilXML = [[UtilXML alloc] init];
[utilXML startXMLCommunication];
int quantidadeDeComicsBaixadas = [utilXML quantidadaDeComicsBaixadas];
main_iPad *mainiPad = [[main_iPad alloc] init];
mainiPad.quantidadeDeComicsBaixadas = quantidadeDeComicsBaixadas;
mainiPad.navigationItem.title = @"TitleFirstScreen";
UIBarButtonItem *botaoSobre = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:mainiPad action:@selector(goToAboutView)];
mainiPad.navigationItem.rightBarButtonItem = botaoSobre;
navController = [[UINavigationController alloc] initWithRootViewController:mainiPad];
navController.navigationBar.tintColor = [UIColor orangeColor];
navController.navigationBar.translucent = YES;
[self.window addSubview:navController.view];
[self.window makeKeyAndVisible];
return YES;
}
Run Code Online (Sandbox Code Playgroud)
这是我的iPhone的委托didFinishLaunchingWithOptions方法:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[[UIApplication sharedApplication] …Run Code Online (Sandbox Code Playgroud) 添加和删除观察者的最佳做法是NSNotificationCenter什么?
我想知道如果加入self作为观察员viewDidLoad和删除self的viewDidUnload就足够了.也许我应该删除self的dealloc为好.
也许需要考虑低内存条件.我可以看到添加viewDidLoad和删除dealloc有问题:viewDidUnload由于内存不足而被调用...然后viewDidLoad在再次显示视图时被调用...现在self已被添加为观察者两次没有删除(因为dealloc不是所谓的).
注意:我正在考虑一个self引用UIViewController子类的基本示例.
我在我的主ViewController中初始化表,数据等.对于更多设置,我想调用另一个Viewcontroller:
DateChangeController *theController = [self.storyboard instantiateViewControllerWithIdentifier:@"dateChangeController"];
[self presentViewController:theController animated:YES completion:^{NSLog(@"View controller presented.");}];
Run Code Online (Sandbox Code Playgroud)
然后一些点击我返回一个segue(自定义:)
NSLog(@"Scroll to Ticket");
[self.sourceViewController presentModalViewController:self.destinationViewController animated:YES];
Run Code Online (Sandbox Code Playgroud)
我的问题:
在返回到我的主ViewController之后,调用了viewDidLoad(每次).我读到,ARC在"转到"另一个ViewController并调用viewDidUnload方法后释放我的mainView,但是我想保留我的所有数据和表格一开始..
有解决方案吗 非常感谢你!
我想知道包含主题中所述关键词的方法被调用的时间.
例如:
– tableView:willSelectRowAtIndexPath:
– tableView:didSelectRowAtIndexPath:
- (BOOL)tableView:(NSTableView *)aTableView shouldSelectRow:(NSInteger)rowIndex
Run Code Online (Sandbox Code Playgroud)
willSelectRow方法何时调用?该方法包括关键词"will""did"和"should"是什么意思
同样,有viewDidAppear和viewWillAppear.调用viewDidAppear方法时很明显.但是视图将会超出我的范围.
希望有人可以提供帮助;)
我正在尝试创建一个简单的天气应用程序,它使用JSON从OpenweatherMap获取数据并在UITableView中打印出来.但是,当我执行下面的代码并在numberOfRowsInSection方法中设置断点时,它返回0行.不知何故,该viewDidLoad方法在该numberOfRowsInSection方法之后调用,这就是为什么threeHoursForecast数组为空.有人可以帮我吗?
static NSString * const BaseURLString = @"http://api.openweathermap.org/data/2.5/forecast?q=Houston";
@interface HPViewController ()
@end
@implementation HPViewController
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
self.threeHoursForecast = [[NSMutableArray alloc] init];
self.tableView.dataSource = self;
self.tableView.delegate = self;
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager POST:BaseURLString parameters:nil
success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSArray *data = [responseObject objectForKey:@"list"];
for (NSDictionary *forecastPerThreeHours in data) …Run Code Online (Sandbox Code Playgroud) 问题摘要
我的mainVC - >第二次VC转换似乎运行了两次.然而,奇怪的是第二个VC的viewDidLoad只运行一次.这是我的项目中唯一存在此问题的转换.
我已经研究了这个并发现了两次加载问题,但没有一个与我的转换两次匹配,但加载一次场景.常见问题,例如在故事板中添加了两个segue的人,没有出现在我的项目中:
在我的第一个/根视图控制器(称为mainVC)中,我以编程方式在viewDidLoad中添加边缘平移手势:
let panLeftEdgeGesture_MainVC = UIScreenEdgePanGestureRecognizer(target: self, action: "panLeftEdge_toLifeList:")
panLeftEdgeGesture_MainVC.edges = .Left
view.addGestureRecognizer(panLeftEdgeGesture_MainVC)
Run Code Online (Sandbox Code Playgroud)
当用户滑动该平移手势时,它会触发一个调用segue到下一个VC的函数.问题是,VC转换出现两次,然后一切正常.什么都没有破裂或崩溃.如果我单击我的自定义后退按钮,则退回到mainVC只会出现一次.
关于原因的实验
这是一个奇怪的部分:为了理解什么是理解,我插入了一些println代码,这是控制台打印的内容:
No matching prepareForSegue: So did nothing to prepare.
LifeList_CollectionView viewDidLoad did run
Pan segue from mainVC to Life Lists did run
No matching prepareForSegue: So did nothing to prepare.
Run Code Online (Sandbox Code Playgroud)
第一行是prepareForSegue运行.它说"什么也没做",因为在我的prepareForSegue中它会检查哪个segue正在运行,有时它会传递一些代码.在这种情况下,prepareForSegue只会打印该行.
第二行是第二个VC的viewDidLoad运行.
第三行看起来很怪异而且不合适我,但我不是专家.println位于mainVC中,并且由pan手势调用的函数打印,这是首先触发segue的函数.为什么这不会在第二个VC的viewDidLoad之前打印?:
func panLeftEdge_toLifeList(sender: UIScreenEdgePanGestureRecognizer) {
performSegueWithIdentifier("segueToLifeLists", sender: nil)
println("Pan segue from mainVC to Life Lists did run")
}
Run Code Online (Sandbox Code Playgroud)
第四行是mainVC的第二次运行的prepareForSegue.但是,我没有看到控制台打印第二个viewDidLoad,即使在视觉上我看到转换发生两次.
知道什么可能导致这种奇怪的行为,或者至少,任何技巧来阻止这种行为?
虽然它很简单,但我仍然发现自己正在努力解决正确的问题.
我试图了解在使用自动布局时,在内部找到REAL(或任何其他子视图)帧的正确方法是什么. UIViewviewDidLoad
主要问题是在viewDidLoad中,视图未应用其约束.我知道这种情况的"已知"答案是
override func viewDidLoad() {
super.viewDidLoad()
view.layoutIfNeeded()
stepContainer.layoutIfNeeded() // We need this Subview real frame!
let realFrame = stepContainer.frame
}
Run Code Online (Sandbox Code Playgroud)
但我发现它并不总是有效,并且不时会给出错误的帧(即不是显示的最终帧).
经过一番研究后,我发现歪曲这段代码可以DispatchQueue.main.async { }得到准确的结果.但是我不确定这是否是正确的处理方法,或者我是否使用此方法导致了一些引擎盖下的问题.最终"工作"代码:
override func viewDidLoad() {
super.viewDidLoad()
DispatchQueue.main.async {
self. stepContainer.layoutIfNeeded()
print(self. stepContainer.frame) // Real frame..
}
}
Run Code Online (Sandbox Code Playgroud)
注意:我只需要从viewDidLoad中找到真正的帧,请不要建议使用viewDidAppear/layoutSubviews等.
viewdidload ×10
ios ×7
iphone ×5
objective-c ×2
segue ×2
swift ×2
uitableview ×2
autolayout ×1
dealloc ×1
delegates ×1
init ×1
storyboard ×1
uiview ×1