我正在编写应用程序,如果用户在通话时查看应用程序,我需要更改视图.
我已经实现了以下方法:
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
NSLog(@"viewWillAppear:");
_sv.frame = CGRectMake(0.0, 0.0, 320.0, self.view.bounds.size.height);
}
Run Code Online (Sandbox Code Playgroud)
但是,当应用程序返回到前台时,它不会被调用.
我知道我可以实现:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(statusBarFrameChanged:) name:UIApplicationDidChangeStatusBarFrameNotification object:nil];
Run Code Online (Sandbox Code Playgroud)
但我不想这样做.我宁愿将所有布局信息放在viewWillAppear:方法中,让它处理所有可能的场景.
我甚至试图从applicationWillEnterForeground:调用viewWillAppear:但我似乎无法确定当前哪个是当前的视图控制器.
有人知道处理这个问题的正确方法吗?我确定我错过了一个明显的解决方案.
我一直对应分配给的任务类型有点不清楚viewDidLoad
对比viewWillAppear
:在一个UIViewController
子类.
例如,我正在做一个应用程序,我有一个UIViewController
子类命中服务器,获取数据,将其提供给视图,然后显示该视图.什么是这样做的利弊viewDidLoad
对比viewWillAppear
?
(这既是问题又是答案,因为需要花费大量时间才能找到真正的答案.)
症状:viewWillAppear
,viewDidAppear
没有被称为在我的UIViewController.
原因:嵌入一个UINavigationController
或UITabBarController
(我的情况)以UIViewController
某种方式中断调用这些方法.
解决方案:在UIViewController
包含上述UINavigationController
/的手动调用它们UITabBarController
.
例如(假设projectNavigationController
是你的UINavigationController
):
-(void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [projectNavigationController viewWillAppear:animated]; } -(void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; [projectNavigationController viewWillDisappear:animated]; } -(void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; [projectNavigationController viewDidAppear:animated]; } -(void)viewDidDisappear:(BOOL)animated { [super viewDidDisappear:animated]; [projectNavigationController viewDidDisappear:animated]; }
在我的情况下,我有一个内部UITabBarController
,我相应地调用方法,所有都解决了.
(对解决方案的归因:http://davidebenini.it/2009/01/03/viewwillappear-not-being-called-inside-a-uinavigationcontroller/)
当我想在屏幕打开时做一些动作时,我把它们放在componentDidMount中.例如,我可以获取一些数据.
像这样.
componentDidMount() {
this.updateData();
}
Run Code Online (Sandbox Code Playgroud)
但是反应导航componentDidMount只在用户第一次打开屏幕时出现一次,如果以后用户再次打开此页面则不会触发componentDidMount.
检测页面(屏幕)何时被激活并执行操作的正确方法是什么?
onfocus viewdidappear viewwillappear react-native react-navigation
当视图即将在屏幕上显示时,在UIViewController上调用viewWillAppear.是否有可能在UIView上获得类似的回调?
我试图从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) 我有一个UIViewController
我从另一个视图控制器内部加载,然后将其视图添加到UIScrollView
.
self.statisticsController = [self.storyboard instantiateViewControllerWithIdentifier:@"StatisticsViewController"];
self.statisticsController.match = self.match;
[self.scrollView addSubview:self.statisticsController.view];
Run Code Online (Sandbox Code Playgroud)
我已经在统计视图控制器中放置断点并且viewDidLoad
正在调用但viewWillAppear
不是.
是因为我没有把它推到层次结构上还是什么?
objective-c uiscrollview uiviewcontroller viewwillappear ios
假设我有UIViewController
A和B.用户使用push segue从A导航到B. 比用户按下后退按钮并来到A.
现在viewWillAppear
称为A. 我可以在这里的代码中知道我来自后退按钮(navigationController popTo...
)而不是通过其他方式吗?而且无需在B视图控制器中编写特殊代码.
是否有正确使用这些方法的指导方针?特别是,我想知道我可以在其中使用什么类型的代码.
例如,如果我必须调用从WS检索数据的方法,我在哪里调用它?我在哪里可以注册/取消注册NSNotification?等等
objective-c uiviewcontroller viewdidappear viewwillappear ios
我面临一个奇怪的错误,只在iOS 10上发生.
我有几个画面的应用程序,每个屏幕的颜色navigationBar
在viewWillAppear
.因此,当您进入下一个屏幕时,它将被正确着色.
但是,在iOS 10上进行测试时,我会在返回上一个屏幕时突然看到以下行为:当前一个屏幕出现时,navigationBar
仍然具有上一个屏幕的颜色,然后闪烁到正确的颜色.它几乎看起来像viewWillAppear
某种行为viewDidAppear
.
相关代码:
视图控制器:
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[ViewControllerPainter paint:self withBackground:[UIColor whiteColor] andForeground:[UIColor blackColor] andIsLight:true];
}
Run Code Online (Sandbox Code Playgroud)
画家:
+ (void)paint:(UIViewController *)controller withBackground:(UIColor *)backgroundColor andForeground:(UIColor *)foregroundColor andIsLight:(bool)isLight
{
controller.navigationController.navigationBar.opaque = true;
controller.navigationController.navigationBar.translucent = false;
controller.navigationController.navigationBar.tintColor = foregroundColor;
controller.navigationController.navigationBar.barTintColor = backgroundColor;
controller.navigationController.navigationBar.backgroundColor = backgroundColor;
controller.navigationController.navigationBar.barStyle = isLight ? UIBarStyleDefault : UIBarStyleBlack;
controller.navigationController.navigationBar.titleTextAttributes = @{NSForegroundColorAttributeName: foregroundColor};
}
Run Code Online (Sandbox Code Playgroud)
这是一个错误吗?我能解决这个问题吗?这非常令人沮丧.
viewwillappear ×10
ios ×6
objective-c ×6
iphone ×3
viewdidload ×2
ios10 ×1
onfocus ×1
react-native ×1
uikit ×1
uiscrollview ×1
uiview ×1
xamarin.ios ×1