是否awakeFromNib得到所谓的viewController分配和初始化后,对不对?awakeFromNib调用视图控制器的精确点是什么?从我的调试会话中,我看到awakeFromNibrootViewController在[self.window makeKeyAndVisible]执行之前不会被调用.
我想知道awakeFromNib()和viewDidLoad()之间的关键区别,以便更清楚地了解它是如何工作的.请有人解释一下吗?
此处链接的示例代码效果很好,允许UIScrollView显示图像,其中包含分页和预览当前图像之前和之后的图像:
我试图将该示例封装在可以重用的单个控件中.所以我创建了一个PagingScrollView:
@interface PagingScrollView : UIView {
IBOutlet UIScrollView * scrollView;
}
@property (nonatomic,retain) IBOutlet UIScrollView * scrollView;
@end
Run Code Online (Sandbox Code Playgroud)
用泥土简单实施
- (void) awakeFromNib
{
[super awakeFromNib];
NSLog(@"awake from nib");
}
Run Code Online (Sandbox Code Playgroud)
在PagingScrollView.xib中,我将包含UIScrollView和ARScrollViewEnhancer的View与原始ScrollViewPagingExampleViewController xib完全相同.其File's Owner的类设置为PagingScrollView,其scrollView插槽设置为子UIScrollView.
在ScrollViewPagingExampleViewController中,我只是声明:
IBOutlet PagingScrollView *pagingScrollView;
Run Code Online (Sandbox Code Playgroud)
在IB中,我拖动一个View,将其类设置为PagingScrollView,并将其pagingScrollView插座连接到PagingScrollView.
在awakeFromNib中,scrollView属性为nil.我认为既然scrollView在同一个笔尖中连接在IB中,那么它就可以使用了.
令人困惑的是,在ScrollViewPagingExampleViewController.xib中,有一个名为scrollView的空插座.这可能表明PagingScrollView的实例与PagingScrollView.xib中定义的实例不同.
因此,我无法使用实际的子视图填充UIScrollView.我在这做错了什么?
我创建了一个自定义 UIView 作为 .xib 文件,其中 UIView 有一个按钮。我使用以下代码加载 UIView。
struct ContentView: View {
var body: some View {
CustomViewRepresentable()
}
}
struct CustomViewRepresentable: UIViewRepresentable {
typealias UIViewType = CustomView
func makeUIView(context: UIViewRepresentableContext<CustomViewRepresentable>) -> CustomView {
let customView = Bundle.main.loadNibNamed("CustomView", owner: nil, options: nil)![0] as! CustomView
return customView
}
func updateUIView(_ uiView: CustomView, context: UIViewRepresentableContext<CustomViewRepresentable>) {
}
}
Run Code Online (Sandbox Code Playgroud)
自定义视图具有以下代码:
class CustomView: UIView {
@IBOutlet weak var button: UIButton!
override init(frame: CGRect) {
super.init(frame: frame)
}
required init?(coder: NSCoder) {
super.init(coder: coder)
} …Run Code Online (Sandbox Code Playgroud) 据我所知,awakeFromNib将始终在viewDidLoad之前调用.
所以我有一个UITableViewController的子类,它是从xib文件中取消归档的.
我在里面定义了这两个方法:
- (void)awakeFromNib {
[super awakeFromNib];
NSLog(@"awake from nib");
}
- (void)viewDidLoad {
[super viewDidLoad];
NSLog(@"view did load");
}
Run Code Online (Sandbox Code Playgroud)
会发生什么是"视图确实加载"出现在控制台中"从笔尖唤醒"之前.我试图在[超级awakeFromNib]上使用断点,并反复点击F7(Step Into),令我惊讶的是,它进入 - (void)viewDidLoad之前进入awakeFromNib内的第二行.
有谁知道这里发生了什么?我在常规UIViewController的子类中做了完全相同的事情,并且日志语句被反转,正如我最初期望的那样......
我有一个NSViewController的子类,它从一个nib加载它的视图(使用initWithNibName:bundle:它是该nib的文件所有者).
我需要在加载nib之后进行一些初始化,并且我希望我的代码最兼容:
所以我的问题是:
Run Code Online (Sandbox Code Playgroud)- (void)initAfterNibLoaded { ... } - (void)viewDidLoad { // Code for ios [self initAfterNibLoaded]; } - (void)awakeFromNib { // Code for osx // Not sure if necessary [super awakeFromNib]; [self initAfterNibLoaded]; }
如果答案1为否,这是一个很好的解决方案吗?:
- (void)viewDidLoad {
// Initialize after nib loaded
}
#ifndef TARGET_OS_IPHONE
- (void)loadView {
// Call parent method
[super loadView];
// Simulate viewDidLoad method
[self viewDidLoad];
}
#endif
Run Code Online (Sandbox Code Playgroud)
谢谢
我有一个自定义的UIView,我使用Xcode(4)放置了它.我需要根据视图的实际边界设置一些默认状态.在awakeFromNib期间,边界似乎返回Xcode中storyboard布局中视图的大小.
视图位于UISplitViewController的详细端,在Xcode中是完整纵向iPad屏幕的大小,但如果应用程序以横向模式加载,则通过spring-and-struts,其大小会更改,但这似乎是发生在awakeFromNib之后.
我应该用其他方法设置这种状态吗?
我一直在学习coredata,通过制作许多基于xcode Navigation控制器模板的简单测试应用程序并选中"使用coredata".
App委托中的awakeFromNib方法一直是我的问题来源,因为我正在向控制器添加其他视图并更改加载顺序,因此RootViewController可能是第二个或第三个选择.
我已经弄清楚awakeFromNib正在做什么,我已经删除了它,因此app委托不再绑定到任何特定的视图.(所以当我想加载RootViewController时,我会将其作为常规视图加载,并使用自己的viewDidLoad为视图初始化managedObjectContext).
我的问题:在AppDelegate中使用awakeFromNIb是否有性能提升或其他好处?或者它只是我从viewDidLoad方法做同样的事情的另一种方式?
我创建了一个UICollectionViewCell包含标签插座的自定义(放在故事板中).我想从awakeFromNib我的自定义方法中获取此标签的高度UICollectionViewCell,但标签的大小始终为0.000000:
// .h
@interface MyCustomCell : UICollectionViewCell
@property (weak, nonatomic) IBOutlet UILabel *myLabel;
@end
// .m
@implementation MyCustomCell
-(void)awakeFromNib
{
[super awakeFromNib];
NSLog(@"%@", self.myLabel);
NSLog(@"%f", self.myLabel.frame.size.width);
NSLog(@"%f", self.myLabel.frame.size.height);
}
@end
Run Code Online (Sandbox Code Playgroud)
控制台输出:
2013-02-06 11:13:59.628 Test[8880:c07] <UILabel: 0x7649a00; frame = (0 0; 0 0); text = '12h00'; clipsToBounds = YES; opaque = NO; autoresize = TM+BM; userInteractionEnabled = NO; layer = <CALayer: 0x7649ac0>>
2013-02-06 11:13:59.628 Test[8880:c07] 0.000000
2013-02-06 11:13:59.630 Test[8880:c07] 0.000000
Run Code Online (Sandbox Code Playgroud)
如何获得标签的大小?在awakeFromNib被叫时获取此类信息还为时尚早吗?如果是这样,我的自定义单元格的哪种方法应该可以得到大小? …
我正在开发一个应用程序,其中大部分UI是通过Xcode中的Storyboard设置的.我想要做的一件事是在TabBar上为UITabBarItem指定"完成"图像,而不是可以通过Interface Builder访问的默认"Stencilled"图像.
我的问题是哪里是最好的地方,我目前在awakeFromNib中这样做,因为它需要在故事板上取消归档时完成,但我不确定我是否应该使用initWithCoder:相反,哪个最好呢?这很重要吗?
- (id)initWithCoder:(NSCoder *)aDecoder {
self = [super initWithCoder:aDecoder];
if(self) {
UIImage *tabIn = [UIImage imageNamed:@"TAB_IN"];
UIImage *tabOut = [UIImage imageNamed:@"TAB_OUT"];
UITabBarItem *tabBarItem = [self tabBarItem];
[tabBarItem setFinishedSelectedImage:tabOut withFinishedUnselectedImage:tabIn];
[tabBarItem setTitle:@"TWO"];
}
return self;
}
Run Code Online (Sandbox Code Playgroud)
要么
- (void)awakeFromNib {
[super awakeFromNib];
UIImage *tabIn = [UIImage imageNamed:@"TAB_IN"];
UIImage *tabOut = [UIImage imageNamed:@"TAB_OUT"];
UITabBarItem *tabBarItem = [self tabBarItem];
[tabBarItem setFinishedSelectedImage:tabOut withFinishedUnselectedImage:tabIn];
[tabBarItem setTitle:@"TWO"];
}
Run Code Online (Sandbox Code Playgroud)
据我所知,initWithCoder:当出口和操作尚未连接时,在从nib(包含在故事板中)取消归档对象的开始时调用.我也理解awakeFromNib在unarchiving过程结束时调用它并发出viewController现在可以使用的信号.我的感觉是,它实际上只取决于你想做什么,虽然使用awakeFromNib可能证明问题较少,因为你不会遇到出口和行动还没有联系起来的问题.
让我改这个,你会用什么情况下initWithCoder:作为并列于awakeFromNib反之亦然?
awakefromnib ×10
ios ×7
iphone ×2
objective-c ×2
swift ×2
uiview ×2
viewdidload ×2
cocoa-touch ×1
delegates ×1
iboutlet ×1
ipad ×1
macos ×1
swiftui ×1
uiscrollview ×1
uitableview ×1
views ×1