我一直对应分配给的任务类型有点不清楚viewDidLoad对比viewWillAppear:在一个UIViewController子类.
例如,我正在做一个应用程序,我有一个UIViewController子类命中服务器,获取数据,将其提供给视图,然后显示该视图.什么是这样做的利弊viewDidLoad对比viewWillAppear?
有什么类似viewDidLoad的UIViewController了UIView??? 我需要在UIView加载(Subclass of UIView)后立即得到通知,并执行一些操作.
在Apple的scrollView示例中,他们不会调用它.我一直认为这是必须的.我为什么要打电话呢?
我想知道是否有人知道为什么当你设置子视图的框架viewDidLoad并且viewWillAppear更改不会影响屏幕,但如果你设置viewDidAppear它们呢?
在我的情况下,我正在加载一个带有两个tableviews的自定义xib,然后尝试将它们向下移动viewDidLoad以允许添加另一个视图的空间,viewDidLoad因为它并不总是需要显示它.
问题是当我设置框架viewDidLoad或viewWillAppear在对象上设置框架时,我可以看到它打印出来,但它没有反映在屏幕上.移动我的设置框架调用viewDidAppear将导致一切按预期工作.
认为我应该能够设置框架是错误的viewDidLoad吗?
- (id)init {
if ( self = [super initWithNibName:@"MyView" bundle:nil] ) {}
return self;
}
- (void)viewDidLoad {
[super viewDidLoad];
self.descriptionWebView = [[[UIWebView alloc] initWithFrame:CGRectMake( 0, 0, self.view.frame.size.width, 200 )] autorelease];
[self.view addSubview:self.descriptionWebView];
self.tableView1.autoresizingMask = UIViewAutoresizingNone;
self.tableView2.autoresizingMask = UIViewAutoresizingNone;
[self.descriptionWebView loadRequest:[NSURLRequest requestWithURL:[[NSBundle mainBundle] URLForResource:@"...." withExtension:@"html"]]];
table1LocationWithHeader = CGRectMake( self.tableView1.frame.origin.x, 200, self.tableView1.frame.size.width, self.tableView1.frame.size.height - 200 );
table2LocationWithHeader = CGRectMake( …Run Code Online (Sandbox Code Playgroud) Android是否具有与Cocoa的viewDidLoad和viewDidAppear函数相同的功能?
如果没有,那么当View出现时我将如何执行操作?我的应用程序是一个标签式应用程序,其中一个选项卡是论坛主题列表.我希望每次出现视图时都刷新主题列表.在Android中这样的事情可能吗?
我有一个非常基本的设置,在UITabBarController中有一个UINavigationController.我想以编程方式布局该navcontroller的rootViewController视图,但是当我查看viewDidLoad中的self.view.frame时,我得到了这个(例如,在横向中):
1. view frame: {{20, 0}, {748, 1024}} // looks like an odd portrait mode
Run Code Online (Sandbox Code Playgroud)
然后我自动旋转到肖像,我得到了这个:
2. view frame: {{0, 0}, {768, 911}}
Run Code Online (Sandbox Code Playgroud)
然后,当我回到Landscape时,框架现在是这样的:
3. view frame: {{0, 0}, {1024, 655}}
Run Code Online (Sandbox Code Playgroud)
并且进一步的自转事件将在帧值#2和#3之间触发.
为了解决#1的怪异问题,我目前正在viewDidLoad中执行此操作:
if (UIInterfaceOrientationIsPortrait(self.interfaceOrientation)) {
self.view.frame = CGRectMake(0, 0, 768, 911);
} else {
self.view.frame = CGRectMake(0, 0, 1024, 655);
}
Run Code Online (Sandbox Code Playgroud)
我觉得我在这里显然缺少一些东西.为什么视图的默认框架在自动旋转回相同方向时与框架不匹配?视图框架是否未设置为初始方向?非常困惑...
我应该提一下,上述所有内容,包括我的kludgy hack,都没有在视觉上改变任何东西.我有黑客的原因是,当我将我的子视图布局到这个视图中时,它们将基于我期望它们的位置,即导航栏下方的左上角.
我究竟做错了什么?
更新:关闭视图更改结果#1的所有自动调整内容:
view frame: {{0, 0}, {748, 1024}}
Run Code Online (Sandbox Code Playgroud)
这似乎有点接近,但仍然不匹配#3.
我想知道awakeFromNib()和viewDidLoad()之间的关键区别,以便更清楚地了解它是如何工作的.请有人解释一下吗?
我认为viewDidLoad会在prepareForSegue结束后被调用.这就是Hegarty如何教他的斯坦福大学课程(最近在2013年2月).
但是,今天我第一次注意到,在READForSegue完成之前调用了viewDidLoad.因此,我在prepareForSegue中设置的属性不可用于目标viewDidLoad方法中的destinationViewController.
这似乎与预期的行为相反.
UPDATE
我只知道发生了什么事.在我的destinationViewController中,我有一个自定义setter,每次更新"model"时都会重新加载tableView:
DestinationViewController
- (void)setManagedObjectsArray:(NSArray *)managedObjectsArray
{
_managedObjectsArray = [managedObjectsArray copy];
[self.tableView reloadData];
}
Run Code Online (Sandbox Code Playgroud)
事实证明,因为destinationViewController是UITableViewController的子类...调用'self.tableView'会强制加载视图.根据Apple的文档,调用视图控制器的view属性可以强制加载视图.UITableViewController的视图是tableView.
因此,在prepareForSegue中,以下行强制加载destinationViewController的视图:
vc.managedObjectsArray = <custom method that returns an array>;
Run Code Online (Sandbox Code Playgroud)
为了解决这个问题,我将destinationViewController模型的自定义setter更改为:
- (void)setManagedObjectsArray:(NSArray *)managedObjectsArray
{
_managedObjectsArray = [managedObjectsArray copy];
if ([self isViewLoaded]) {
[self.tableView reloadData];
}
}
Run Code Online (Sandbox Code Playgroud)
如果tableView在屏幕上,这将只重新加载tableView.因此,在prepareForSegue期间不强制加载视图.
如果有人反对这个过程,请分享您的想法.否则,我希望这可以防止一个人长时间不眠之夜.
我试图从Apple的粗略文档中找出哪种方法是初始化并将我的Views控件添加到控制器视图的最佳位置.
使用winforms它是相当简单的,因为它们总是在内部初始化InitializeDesigner,在构造函数中调用.如果可能的话,我正试图匹配这种模式的可靠性.
我工作UIViewControllers和UITableViewControllers内部的UINavigationController,如果这影响了一切-大部分时间.
这是一个例子:
public MyController()
{
// Here?
AddViews();
}
public override ViewDidLoad()
{
base.ViewDidLoad();
// Or is should it be here?
AddViews();
}
public override ViewWillAppear(bool )
{
base.ViewWillAppear(animated);
// Here?
AddViews();
}
public override ViewDidAppear(bool animated)
{
base.ViewDidLoad(animated);
// Or maybe here?
AddViews();
}
void AddViews()
{
UILabel label = new UILabel();
label.Text = "Test";
label.Frame = new RectangleF(100,100,100,26);
View.AddSubView(label);
UIWebView webview = new UIWebView();
webview .Frame …Run Code Online (Sandbox Code Playgroud) 我有两个窗口应用程序,当我呈现第一个窗口时,我希望第二个窗口中的视图加载并准备以后在后台的内容.
我试过使用方法,loadView但Apple说你不应该直接调用这个方法.
到目前为止,我已经选择使用视图的方法userInteractionEnabled,它实际上隐式调用viewDidLoad方法.
是否有一种优雅的方法可以强制ViewControllers viewDidLoad方法在自然之前(当窗口是关键并呈现时)进行激活?
viewdidload ×10
iphone ×6
ios ×5
uiview ×3
objective-c ×2
android ×1
awakefromnib ×1
frame ×1
ipad ×1
loadview ×1
segue ×1
storyboard ×1
swift ×1
xamarin.ios ×1