我什么时候应该释放我在程序中分配的所有内存?
因为我只有一个viewDidLoad方法,我在那里开展业务.我应该只在viewDidUnload中将dealloc留空并清理吗?
什么时候可以知道UIViewController视图的确切大小?
我有一个多行,UILabel其帧取决于其文本和父视图的宽度.考虑到我需要放置其他视图下面的UILabel,它做它的框架盖文的准确的空间是很重要的.
我目前正在计算这样的大小viewDidLoad:
labelSize = [text sizeWithFont:font constrainedToSize:CGSizeMake(self.view.frame.size.width, MAX_HEIGHT)];
Run Code Online (Sandbox Code Playgroud)
问题是当父视图UIViewController用作模态表单或弹出框时,父视图的宽度会发生变化.如果我使用autoresizingMaskUILabel的框架进行相应的调整,但它不再适合文本.
UILabel知道UIViewController's视图的确切大小,我在哪里可以计算出这个框架?
这是在显示UIViewController模态表单(UIModalPresentationFormSheet)时打印self.view.frame的结果.
viewDidLoad: (0.000000;0.000000;320.000000;480.000000)
viewWillAppear: (0.000000;0.000000;768.000000;960.000000)
afterDelay: (0.000000;0.000000;540.000000;576.000000)
Run Code Online (Sandbox Code Playgroud)
产生上述输出的代码:
- (void)viewDidLoad {
[super viewDidLoad];
[Utils logFrame:self.view.frame tag:@"viewDidLoad"];
}
- (void) viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[Utils logFrame:self.view.frame tag:@"viewWillAppear"];
[self performSelector:@selector(afterDelay) withObject:nil afterDelay:0.1];
}
- (void) afterDelay {
[Utils logFrame:self.view.frame tag:@"afterDelay"];
}
Run Code Online (Sandbox Code Playgroud) 我需要一种viewDidLoad在按下'后退'按钮时调用方法的方法UINavigationController.所以,例如,如果我有这样的流程:
查看A - >查看B - >查看C.
我需要它,这样,如果我在View C,我压回,View B的viewDidLoad方法应该被调用.同样,如果我打开View B并按下后退按钮View A的viewDidLoad方法应该被调用.
请有人建议如何实现这一目标?
我有一个iOS应用程序.应用程序有2种不同的视图:Main和Settings.实际上,应用程序需要在主视图中使用之前加载和初始化某些库和框架.
当我把这个初始化放在viewDidLoad方法中时,它工作正常.但是当转到"设置"并返回"主视图"时,初始化将再次启动,这不是我想要的,并且应用程序会导致内存问题.
我需要一个在应用程序启动时调用一次的方法.任何的想法?
编辑:我切换到选项卡视图.它加载一次视图.这是另一种解决方案.
我正在学习核心动画并尝试示例.
当我使用以下代码时,动画持续时间有效
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
//Modifying base layer
self.view.layer.backgroundColor = [UIColor orangeColor].CGColor;
self.view.layer.cornerRadius = 20.0;
self.view.layer.frame = CGRectInset(self.view.layer.frame, 20, 20);
//Adding layer
mylayer=[CALayer layer]; //mylayer declared in .h file
mylayer.bounds=CGRectMake(0, 0, 100, 100);
mylayer.position=CGPointMake(100, 100); //In parent coordinate
mylayer.backgroundColor=[UIColor redColor].CGColor;
mylayer.contents=(id) [UIImage imageNamed:@"glasses"].CGImage;
[self.view.layer addSublayer:mylayer];
}
- (IBAction)Animate //Simple UIButton
{
[CATransaction begin];
// change the animation duration to 2 seconds
[CATransaction setValue:[NSNumber numberWithFloat:2.0f] forKey:kCATransactionAnimationDuration];
mylayer.position=CGPointMake(200.0,200.0);
mylayer.zPosition=50.0;
mylayer.opacity=0.5;
[CATransaction commit];
}
@end
Run Code Online (Sandbox Code Playgroud)
另一方面,如果我将Animate方法代码集中在ViewDidLoad按钮的底部,以便在不按任何按钮的情况下发生,则不会遵守动画持续时间.我只看到没有任何动画的最终结果.
有什么想法吗?
谢谢九巴
可能重复:
UIViewController返回无效帧?
调试时我注意到在viewDidLoad调用时我的视图框架origin=(x=0, y=20) size=(width=320, height=460)不准确.在viewWillAppear通话中它设置正确:origin=(x=0, y=0) size=(width=320, height=416)考虑导航栏高度.我的子视图布局取决于根视图,但我不希望每次出现视图时都设置它们.
我们该怎么处理这两个电话?
我在故事板文件中设置了一个容器视图,但我想在设置一些属性后以编程方式嵌入视图控制器。这是我在父 VC 的 viewDidLoad 中的代码:
_workoutVC = [[UIStoryboard storyboardWithName:@"Main" bundle:nil] instantiateViewControllerWithIdentifier:@"entryTableVC"];
_workoutView = _workoutVC.tableView;
[self addChildViewController:_workoutVC];
[_workoutVC.tableView setFrame:_container.bounds];
[_container addSubview:_workoutView];
Run Code Online (Sandbox Code Playgroud)
然而,子进程中的viewDidLoad并不是随时被调用的。当我运行模拟器时,我的容器视图是空白的。我已经在调试器中检查过我的属性都不是nil.
我在我的应用程序中使用SWRevealViewController(以获得滑出侧面板)但是每当用户导航到另一个viewController(如'settings')并返回时,一切都会重置.我知道这是故事板的正常行为,因为实例化了新VC并且每次调用viewDidLoad.我试图通过将VC存储在AppDelegate中的数组中然后返回到原始的viewController来解决这个问题,这会阻止在最初重新呈现原始VC时调用viewDidLoad,但我仍然发现它在之间移动时被随机调用veiwcontroller's,重置我的所有属性等.在研究中,Apple文档确实说不要假设viewDidLoad只会被调用一次.
在切换标签时,这种行为在UITabBarController中是显而易见的,因为我正在考虑放弃SWRevealViewController并使用它而不是让它不那么头痛.
我应该以不同的方式处理,即.在NSUserDefaults中存储'state'并在viewDidLoad上恢复?
提前致谢.
我一直在关注这个教程,有一个幻灯片菜单.我添加了一个TableViewController,它将显示文章列表.由于某种原因,viewDidLoad没有开火.
在本教程中SideViewController,控制将显示哪个控制器,如果具有segue标识符"showPhoto",它将加载特定图像.
// Set the photo if it navigates to the PhotoView
if ([segue.identifier isEqualToString:@"showPhoto"]) {
PhotoViewController *photoController = (PhotoViewController*)segue.destinationViewController;
NSString *photoFilename = [NSString stringWithFormat:@"%@_photo.jpg", [menuItems objectAtIndex:indexPath.row]];
photoController.photoFilename = photoFilename;
}
Run Code Online (Sandbox Code Playgroud)
我想为重新创建同样的东西,TableViewController并尝试强制viewDidLoad控制器,如此处所示强制viewDidLoad在iOS上触发,但它仍然无法正常工作:
if ([segue.identifier isEqualToString:@"showList"]) {
TableViewController *tableController = (TableViewController*)segue.destinationViewController;
[tableController view];
}
Run Code Online (Sandbox Code Playgroud)
TableViewController viewDidLoad:
- (void)viewDidLoad
{
[super viewDidLoad];
// Change button color
_sidebarButton.tintColor = [UIColor colorWithWhite:0.1f alpha:0.9f];
// Set the side bar button action. …Run Code Online (Sandbox Code Playgroud) 我正在实现自己的"后退"按钮.其中onClick,以下代码在ViewController被解雇的(VC)中执行:
navigationStack navigationStack,然后使用它presentViewController
后面的工作是视觉上有效的 - 即当前VC消失,之前VC出现.但是,viewDidLoad不调用该方法.因此,屏幕不会更新数据更新viewDidLoad.
[self dismissCurrentViewController:self completion:^{
[TWStatus dismiss];
FHBaseViewController *vcToDisplay = [[FHDataManager sharedInstance] popNavigationStack];
[vcToDisplay.homeVC presentViewController:vcToDisplay animated:NO completion: ^{ }];
}];
Run Code Online (Sandbox Code Playgroud)
问题:
viewDidLoad在presentViuewController使用时总会被调用?viewDidLoadVC#2中的一个名为ONLY的方法"构建"屏幕.iOS如何在不显示屏幕的情况下显示viewDidLoad?顺便说一下,我没有使用故事板.任何帮助表示赞赏!
viewdidload ×10
ios ×8
objective-c ×5
ipad ×2
iphone ×2
calayer ×1
cocoa-touch ×1
ios4 ×1
opengl-es ×1
uitableview ×1
view ×1
xcode4 ×1