从 ViewController 调用 nib 方法
Posted
技术标签:
【中文标题】从 ViewController 调用 nib 方法【英文标题】:Call nib method from ViewController 【发布时间】:2015-12-25 13:45:38 【问题描述】:请告诉我我做错了什么。我在 ViewController 中有一个 *nib 文件的实例。 ViewController 实现 UITextFieldDelegate。在委托方法“textField shouldChangeCharactersInRange”中,我调用了 *nib 类中编写的方法。在 *nib 类中,我初始化了一个用户对象,但在 ViewController 调用的方法中,用户对象是 nil...
这里是代码..
@implementation ViewController
- (void)viewDidLoad
[super viewDidLoad];
self.usersTableView = [[UsersTableView alloc] init];
// Call delegate method
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
[self.usersTableView searchTextFieldDidChange:searchString];
*笔尖类
#import "User.h"
@interface UsersTableView()
@property (nonatomic) User *user;
@end
- (instancetype)initWithCoder:(NSCoder *)aDecoder
self = [super initWithCoder:aDecoder];
if (self)
[[NSBundle mainBundle] loadNibNamed:@"UsersTableView" owner:self options:nil];
[self addSubview:self.view];
self.user = [[User alloc] init];
return self;
.....Anyware [self testMethod];
- (void)testMethod
NSLog (@"%@", self.user) // user object exist
// Method called from ViewController
- (void)searchTextFieldDidChange:(NSString *)searchText
NSLog (@"%@", self.user) // user object is nil...
有什么建议吗?
【问题讨论】:
您是否附加了故事板的委托? 检查文件所有者和文本字段的委托 嘿,你是否在 textField 中显示了文本字符串 shouldChangeCharactersInRange.. 并且请输入 return yes bcs 那是非 void 方法。 【参考方案1】:我在您的实施中发现了许多错误。请让我一一更正。
-(instancetype)initWithCoder:(NSCoder *)aDecoder
self = [super initWithCoder:aDecoder];
if (self)
[[NSBundle mainBundle] loadNibNamed:@"UsersTableView" owner:self options:nil];
[self addSubview:self.view];
self.user = [[User alloc] init];
return self;
loadNibNamed: 方法将返回一个 UIView* 数组。如果要使用 nib 中的视图,则需要使用它的返回值。
- (instancetype)initWithCoder:(NSCoder *)aDecoder
self = [super initWithCoder:aDecoder];
if (self)
NSArray* viewArray = [[NSBundle mainBundle] loadNibNamed:@"UsersTableView" owner:self options:nil];
[self addSubview:[viewArray firstObject]];
self.user = [[User alloc] init];
return self;
-
自定义类初始化:
您使用简单的 alloc init 创建 tableView,它不调用 initWithCoder 方法。
self.usersTableView = [[UsersTableView alloc] init];
我认为你应该实现- (instancetype)init
方法,并将自定义视图初始化放在那里。
-(instancetype)init
self = [super init];
if (self)
NSArray* viewArray = [[NSBundle mainBundle] loadNibNamed:@"UsersTableView" owner:self options:nil];
[self addSubview:[viewArray firstObject]];
self.user = [[User alloc] init];
return self;
我希望它会有所帮助,并且会奏效。
【讨论】:
我将外部 *nib 加载到 Storyboard 的 ViewController 中的 UIView 中。你告诉我的方法 -NSArray* viewArray = [[NSBundle mainBundle] loadNibNamed:@"UsersTableView" owner:self options:nil]; [self addSubview:[viewArray firstObject]];
不要在 UIView 中显示表格视图。我有一个到 *nib 类中的 tableView 的 IBOutlet 连接,并且这个引用在 nil ...
您能检查一下数组中的第一个视图是什么吗?如果它是所需的 tableView,则检查它的框架。我认为它的框架是无效的。尝试 UIView* firstView = [viewArray firstObject]; firstView.frame = self.bounds; [self addSubview:firstView];
viewArray的第一个对象是UIView。 UIView:0x7b63b2e0;帧 = (0 0; 320 447);自动调整大小 = W+H;层 = - (instancetype)initWithCoder:(NSCoder *)aDecoder
方法中,所有视图对象(UITableView 和UserTableView 实例)都初始化正确。问题是当我从 UIViewController 调用用 UsersTableView.m 编写的方法时,所有对象都是 nil ......无论如何,谢谢你的帮助!如果你想看项目,这里是github的链接->github.com/makedonskii/Keyboard.git
我检查了代码,我发现了问题,您想在这里描述问题,或者我可以向一些 cmets 提出拉取请求吗?【参考方案2】:
initWithCoder 仅在您从故事板实例化视图控制器时被调用。不幸的是,在您的情况下,用户对象正在 initWithCoder 中初始化,而您正在使用 init 创建 viewcontroller 的实例。
尝试从故事板加载视图控制器。
UIStoryboard *sb = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
UIViewController *vc = [sb instantiateViewControllerWithIdentifier:@"myViewController"];
或者如果你想从 xib 加载视图控制器使用
NSArray *subviewArray = [[NSBundle mainBundle] loadNibNamed:@"Your_nib_name" owner:self options:nil];
UIView *mainView = [subviewArray objectAtIndex:0];
如果您仍然不满意,请覆盖您的 nib 类的 init 并在 init 方法中实例化用户对象,尽管我不喜欢这样做:)
编码愉快:)
【讨论】:
【参考方案3】:UIStoryboard *sb = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
UIViewController *vc = [[UIViewContoller alloc]init];
vc = [sb instantiateViewControllerWithIdentifier:@"myViewController"];
[self presentViewController:vc animated:YES complited:nil];
【讨论】:
请描述如何解决上述问题。以上是关于从 ViewController 调用 nib 方法的主要内容,如果未能解决你的问题,请参考以下文章
从 UIButton 向 ViewController 发送通知
从 NIB 错误加载 ViewController [重复]
如何从 ViewController 中的 xib (nib) 实例化 UIView / UITableView