对于来自NIB文件

时间:2016-04-08 03:12:51

标签: ios objective-c uitableview

我遇到了在TableView中运行两个ViewController的问题。

修改 为了使问题更容易理解,我已将代码段放在代码下面。

可能相关的事情:

  1. 两者都使用自定义单元格。
  2. 从我对调试器所做的工作来看,虽然它没有通过以下if语句:

    if(tableView == self.tblFriendsList){...}

  3. 3.最初我试图使用Containment View添加第二个UITableViewController,但现在我选择尝试使用UITableView。

    1. 包含视图(包含两个tableViews)来自NIB。

    2. 我已尝试手动添加委托和数据源,并通过文件的所有者。

    3. 我已经更改了代码,这样如果它没有执行if语句,那么它将执行另一个表(成功设置)所需的内容,但之前它也适用于当我使用下面写的示例时,第一个表。当用作tableView时或者当我尝试将整个ViewController添加到子视图时,它是另一个表无法加载(我在两者之间进行了交换以尝试解决此问题)。

    4. 拼写已经多次检查实际代码,所以我更想到它可能与它没有输入上述if语句的事实有关。

    5. 我从视频/ Stack Exchange看到的大多数例子主要是在今年之前,所以我想知道是否有我错过的实用编码的更新。

    6. 可悲的是,我只是为那些想要完全复制他们设计的人做这份工作,或者我会想到一个更好的选择!

    7. 到目前为止,我已经尝试了所有的答案,但是已经很短了......虽然我已经看到太多关于此的教程已经成功了,所以我对一些有趣的事情非常不确定......

    8. 再次编辑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; } 个出口添加了delegatedatasource自我,并且它已经从那里开始工作了,但我我有一个出口装载的问题,而不是另一个。

      上面的图片让我调试了这个问题,我已经逐步执行了该函数并且它成功启动了第一个案例,但是后来从函数返回并且没有为其他TableView执行。

      代码很棘手,因为我有自定义案例,但是如果对调试有任何其他想法或对帮助的参考,那将是值得赞赏的。

      总结:

      2 TableView
      两者都联系到TableViewsdelegate 每个datasource使用2个自定义NIB单元格 只执行一次

3 个答案:

答案 0 :(得分:0)

添加 第204行NSLog(@"Table:%@", tableView)。 看看它是否打印了两个不同的tableViews。 并尝试用if([tableView isEqual:self.tblFriendLocation])

替换第205行

答案 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]) 

首先,这是你必须检查平等的方法。然后发布所有方法,以便人们可以确切地看到您的代码出了什么问题。