我遇到了在TableView
中运行两个ViewController
的问题。
修改 为了使问题更容易理解,我已将代码段放在代码下面。
可能相关的事情:
从我对调试器所做的工作来看,虽然它没有通过以下if语句:
if(tableView == self.tblFriendsList){...}
3.最初我试图使用Containment View添加第二个UITableViewController,但现在我选择尝试使用UITableView。
包含视图(包含两个tableViews)来自NIB。
我已尝试手动添加委托和数据源,并通过文件的所有者。
我已经更改了代码,这样如果它没有执行if语句,那么它将执行另一个表(成功设置)所需的内容,但之前它也适用于当我使用下面写的示例时,第一个表。当用作tableView时或者当我尝试将整个ViewController添加到子视图时,它是另一个表无法加载(我在两者之间进行了交换以尝试解决此问题)。
拼写已经多次检查实际代码,所以我更想到它可能与它没有输入上述if语句的事实有关。
我从视频/ Stack Exchange看到的大多数例子主要是在今年之前,所以我想知道是否有我错过的实用编码的更新。
可悲的是,我只是为那些想要完全复制他们设计的人做这份工作,或者我会想到一个更好的选择!
到目前为止,我已经尝试了所有的答案,但是已经很短了......虽然我已经看到太多关于此的教程已经成功了,所以我对一些有趣的事情非常不确定......
再次编辑11。即使设置tableView标记并运行if语句,调试器仍会显示跳过if语句的代码。即使调用重新加载数据方法,调试器也不会有另一个中断。
目前,代码如下:
对于viewDidLoad:
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
self.m_arrVenueList=[[NSMutableArray alloc]init];
self.m_dictCells = [[NSMutableDictionary alloc] init];
[self setNavigationProperties];
[self loadFriendByLocation];
[self setRefreshController];
self.m_dictFriendListCells = [[NSMutableDictionary alloc] init];
self.tblFriendLocation.delegate = self;
self.tblFriendLocation.dataSource = self;
self.tblFriendsList.delegate = self;
self.tblFriendsList.dataSource = self;
[self.tblFriendsList reloadData];
}
对于numberOfRowsInSection:
注意:每个部分只有一个部分。
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
if (tableView == self.tblFriendsList) {
return [self.arrFriendsList count];
}
// Return the number of rows in the section.
return [self.m_arrVenueList count];
}
对于cellForRowAtIndexPath:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
if (tableView == self.tblFriendsList) {
NSDictionary *friends=[self.arrFriendsList objectAtIndex:indexPath.row];
NSString *friendID = [Utility formattedValue:[friends objectForKey:@"user_id"]];
// Configure the cell using friend object...
NSString *sIdentifier = [NSString stringWithFormat:@"TableCell_%ld",(long)friendID];
FriendListVenueCell *cell = (FriendListVenueCell *)[self.m_dictCells objectForKey:sIdentifier];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
if (cell == nil)
{
cell = (FriendListVenueCell*)[Utility getViewFromXib: @"FriendListVenueCell" classname:[FriendListVenueCell class] owner:tableView];
if (indexPath.row%2 != 0)
{
cell.contentView.backgroundColor = UIColorWithRGB(11,21,39);
}
else
{
cell.contentView.backgroundColor = UIColorWithRGB(12,23,32);
}
}
[cell setCellDataForFriend:friends];
[self.m_dictCells setObject:cell forKey:sIdentifier];
return cell;
}
// Configure the cell using friend object...
NSString *sIdentifier = [NSString stringWithFormat:@"TableCell_%ld",(long)indexPath.row];
FriendsAtVenueCell *cell = (FriendsAtVenueCell*)[self.m_dictCells objectForKey:sIdentifier];
if (cell == nil)
{
cell = (FriendsAtVenueCell *)[Utility getViewFromXib:@"FriendsAtVenueCell" classname:[FriendsAtVenueCell class] owner:tableView];
cell.m_FriendViewContrller = self;
[self.m_dictCells setObject:cell forKey:sIdentifier];
if (indexPath.row%2 != 0)
{
cell.contentView.backgroundColor = UIColorWithRGB(11,21,39);
}
else
{
cell.contentView.backgroundColor = UIColorWithRGB(12,23,32);
}
}
cell.delegate=self;
Venue *tempDic=(Venue*)[self.m_arrVenueList objectAtIndex:indexPath.row];
[cell setCellData:tempDic];
if (tempDic.nVenueId == 0)
{
[cell.m_imgLogo setHidden:YES];
[cell.m_imgLogobg setHidden:YES];
[cell.m_btnFollow setHidden:YES];
}
cell.btnFifthImg.tag = indexPath.row;
cell.m_btnFollow.tag = tempDic.nVenueId;
cell.m_RowId= indexPath.row;
cell.selectionStyle = UITableViewCellSelectionStyleNone;
return cell;
}
到目前为止,我尝试做的事情 - 从我从StackExchange中读到并在教程中看到的 - 是让方法cellForRowAtIndexPath
为每个cell
分别设置案例,然后返回{ {1}}。
示例包括
cell
希望这个问题不会太长,我试图压缩它!
编辑完成
我已经在几个视频中看到了这一点,他们为每个if (tableView == oneTableViewOutlet) {
//load cell
return cell;
} else if (tableView == anotherTableViewOutlet) {
//load cell
return cell;
}
个出口添加了delegate
和datasource
自我,并且它已经从那里开始工作了,但我我有一个出口装载的问题,而不是另一个。
上面的图片让我调试了这个问题,我已经逐步执行了该函数并且它成功启动了第一个案例,但是后来从函数返回并且没有为其他TableView执行。
代码很棘手,因为我有自定义案例,但是如果对调试有任何其他想法或对帮助的参考,那将是值得赞赏的。
总结:
2 TableView
两者都联系到TableViews
和delegate
每个datasource
使用2个自定义NIB
单元格
只执行一次
答案 0 :(得分:0)
添加
第204行NSLog(@"Table:%@", tableView)
。
看看它是否打印了两个不同的tableViews。
并尝试用if([tableView isEqual:self.tblFriendLocation])
答案 1 :(得分:0)
设置tableview的标记并与标记
进行比较 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
TablevIewCell1 *cell1=[tableView dequeueReusableCellWithIdentifier:@"CellId1"];
TablevIewCell2 *cell2=[tableView dequeueReusableCellWithIdentifier:@"CellId2"];
switch (tableView.tag) {
case 1:
[cell1.textLabel1 setText:[self.arrForTableView1 objectAtIndex:indexPath.row]];
return cell1;
break;
case 2:
[cell2.textLabel2 setText:[self.arrForTableView2 objectAtIndex:indexPath.row]];
return cell2;
break;
default:
break;
}
return nil;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
if (tableView ==self.tableView1)
return self.arrForTableView1.count;
else
return self.arrForTableView2.count;
}
或者
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
TablevIewCell1 *cell1=[tableView dequeueReusableCellWithIdentifier:@"CellId1"];
TablevIewCell2 *cell2=[tableView dequeueReusableCellWithIdentifier:@"CellId2"];
if ([tableView isEqual:self.tableView1]) {
[cell1.textLabel1 setText:[self.arrForTableView1 objectAtIndex:indexPath.row]];
return cell1;
} if ([tableView isEqual:self.tableView2]){
[cell2.textLabel2 setText:[self.arrForTableView2 objectAtIndex:indexPath.row]];
return cell2;
}
return nil;
}
希望这会对你有所帮助。
答案 2 :(得分:0)
if([tableview isEqual:tblName])
首先,这是你必须检查平等的方法。然后发布所有方法,以便人们可以确切地看到您的代码出了什么问题。