不会调用cellForRowAtIndexPath

时间:2016-02-10 02:03:49

标签: ios objective-c uitableview uiviewcontroller

据我所知,很多人都在堆栈上询问过这个问题。但是,这些都不能解决我的问题。我尝试以编程方式构建tableview,并且不调用cellForRowAtIndexPath。但是当我在故事板中拖动一个tableview时,一切都很好。这是相关的代码。

这是viewDidLoad中的代码

- (void)viewDidLoad
{
[self.navigationController.navigationBar setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[UIColor whiteColor],NSForegroundColorAttributeName,nil]];
self.navigationController.navigationBar.tintColor=[UIColor whiteColor];
self.navigationItem.title = @"发布失物招领启示";

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]
                               initWithTarget:self
                               action:@selector(dismissKeyboard)];
[self.view addGestureRecognizer:tap];
[tap setCancelsTouchesInView:NO];

self.itemDetails = @"请输入详情";

self.view.translatesAutoresizingMaskIntoConstraints = NO;

self.tableView = ({
    UITableView *tableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStyleGrouped];
    tableView.dataSource = self;
    tableView.delegate = self;
    tableView.translatesAutoresizingMaskIntoConstraints = NO;
    [tableView reloadData];
    tableView;
});

[self.tableView registerNib:[UINib nibWithNibName:campusCellIdentifier bundle:nil] forCellReuseIdentifier:campusCellIdentifier];
[self.tableView registerNib:[UINib nibWithNibName:imageCellIdentifier bundle:nil] forCellReuseIdentifier:imageCellIdentifier];
[self.tableView registerNib:[UINib nibWithNibName:textFieldCellIdentifier bundle:nil] forCellReuseIdentifier:textFieldCellIdentifier];

UIVisualEffectView *effectView = [[UIVisualEffectView alloc] initWithEffect:[UIBlurEffect effectWithStyle:UIBlurEffectStyleExtraLight]];
effectView.frame = self.view.bounds;
[self.view addSubview:effectView];
self.postButton = [[AYVibrantButton alloc] initWithFrame:CGRectZero style:AYVibrantButtonStyleFill];
self.postButton.vibrancyEffect = nil;
self.postButton.text = @"发布";
self.postButton.font = [UIFont systemFontOfSize:18.0];
self.postButton.backgroundColor = [UIColor BBTAppGlobalBlue];
self.postButton.translatesAutoresizingMaskIntoConstraints = NO;
[effectView.contentView addSubview:self.postButton];

[self.view addSubview:self.tableView];

//Set up constraints
CGFloat verticalInnerSpacing = 10.0f;
CGFloat buttonHeight = 50.0f;
CGFloat tabBatHeight = self.tabBarController.tabBar.frame.size.height;
CGFloat navigationBarHeight = self.navigationController.navigationBar.frame.size.height;

[self.tableView mas_makeConstraints:^(MASConstraintMaker *make) {
    make.top.equalTo(self.view.mas_top).offset(navigationBarHeight + 20);
    make.bottom.equalTo(self.view.mas_bottom).offset(-tabBatHeight - 2*verticalInnerSpacing - buttonHeight);
    make.centerX.equalTo(self.view.mas_centerX);
    make.width.equalTo(self.view.mas_width);
}];

[self.postButton mas_makeConstraints:^(MASConstraintMaker *make){
    make.bottom.equalTo(self.view.mas_bottom).offset(-tabBatHeight - verticalInnerSpacing);
    make.height.equalTo(@(buttonHeight));
    make.width.equalTo(self.view.mas_width).multipliedBy(0.55);
    make.centerX.equalTo(self.view.mas_centerX);
}];

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
}



- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 3;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return 3;
}

协议中的那些。 谢谢你的帮助!

3 个答案:

答案 0 :(得分:0)

正如其他人所说,如果你不将表视图添加为视图控制器内容视图的子视图,那么它将不会尝试绘制自己,也不会调用任何委托/数据源方法。 / p>

下一点:“相关代码”来自哪里?什么方法,在哪种方法?

下一点:

这种语法是什么?

self.tableView = ({
    UITableView *tableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStyleGrouped];
    tableView.dataSource = self;
    tableView.delegate = self;
    tableView.translatesAutoresizingMaskIntoConstraints = NO;
    tableView;
});

您在Objective-C代码中看到过哪种语法?我从来没有见过那种编码风格,而且自2007年以来我一直在密切关注Objective-C。我认为大括号表示一个范围,因为范围中的最后一个是表达式tableView;,所以范围评估该变量?啊。

答案 1 :(得分:0)

你必须将UItableView的数据源和委托设置到你自己的类.....其他明智的你的表视图将无法从你的类变量中获取数据.....

请点击此链接阅读有关数据来源和委派的信息

https://developer.apple.com/library/ios/documentation/General/Conceptual/CocoaEncyclopedia/DelegatesandDataSources/DelegatesandDataSources.html

答案 2 :(得分:0)

删除

self.view.translatesAutoresizingMaskIntoConstraints = NO;

在viewDidLoad中,通常系统会处理视图控制器视图的约束设置。它执行此操作的机制是自动调整掩码。当self.view.translatesAutoresizingMaskIntoConstraints = NO系统期望为其提供约束但没有添加约束时,我不确定此实例是否存在已定义的行为,但它最好是通过允许系统处理self.view的大小和位置来避免它。