Ios UITableView一遍又一遍地重复单元格

Ios UITableView一遍又一遍地重复单元格,ios,objective-c,uitableview,Ios,Objective C,Uitableview,我有一个UITableView,它一次又一次地重复单元格,我不明白为什么,我已经尝试过用谷歌搜索它,并查看其他类似的堆栈溢出问题,但其中的任何解决方案似乎都不能解决我遇到的问题 我的代码如下: ViewDidLoad方法中的NSArray: tableViewContents = @[ @"Infosecurity Netherlands:4th November:Jaarbeurs Utrecht-Utrecht,Netherlands:www.infosecurity.nl/",

我有一个UITableView,它一次又一次地重复单元格,我不明白为什么,我已经尝试过用谷歌搜索它,并查看其他类似的堆栈溢出问题,但其中的任何解决方案似乎都不能解决我遇到的问题

我的代码如下:

ViewDidLoad方法中的NSArray:

tableViewContents = @[
    @"Infosecurity Netherlands:4th November:Jaarbeurs Utrecht-Utrecht,Netherlands:www.infosecurity.nl/",
    @"MiCS Monaco International Clubbing Show:4th - 6th November:Grimaldi Forum-Monaco, Monaco:www.mics.mc/",
    @"New York Audio Show 2015:6th - 8th November:Hilton Westchester-Rye Brook, NY:www.chestergroup.org/newyorkaudioshow/2015",
    @"Tecno Multimedia InfoComm 2015:10th - 12th November:Corferias-Bogota, Columbia:www.tecnomultimedia.com/",
    @"Productronica 2015:10th - 13th November:New Munich Trade Show Center-Munich, Germany:productronica.com/en/home",
    @"CCW featuring SATCON co-located InfoComm Connections:11th November:Jacob Javits Center, New York, NY:www.ccwexpo.com/",
    @"IAAPA Attractions Expo 2015:16th - 20th November:Orange County Convention Center-Orlando, FL:www.iaapa.org/expos/iaapa-attractions-expo/",
    @"Streaming Media West 2015:17th November:Hyatt Regency Huntington Beach-Huntington Beach, CA:www.streamingmedia.com/Conferences/",
    @"SATIS:17th - 19th November:Porte de Versailles-Paris, France:www.satis-expo.com/",
    @"ISC East Expo 2015:18th November:Jacob K. Javits Convention Center-New York, NY:www.isceast.com/",
    @"WFX Worship Facilities Conference and Expo:18th November:Music City Center-Nashville, TN:wfxweb.com/",
    @"Inter BEE 2015:18th - 20th November:Makuhari Messe-Chiba, Japan:www.inter-bee.com/en/",
    @"AV Executive Conference:18th - 20th November:TBA-Amelia Island, FL:www.infocomm.org/cps/rde/xchg/infocomm/hs.xsl/39221.htm",
    @"JTSE Performance & Entertainment Technical Show & Convention 2015:24th November:Dock Pullman, Porte de la Chapelle-Paris, France:www.jtse.fr/en/index.php",
    @"Government Video Expo 2015:1st - 3rd December:Walter E. Washington Convention Center-Washington, DC:www.gvexpo.com/",
    @"IIDEX Canada:2nd December:Metro Toronto Convention Centre North-Toronto, ON, Canada:www.iidexcanada.com/",
    @"IABM Annual International Business Conference 2015:3rd December:TBA:www.theiabm.org/",
    @"SMSS The Social Media Strategies Summit Dallas:8th December:The Magnolia Hotel-Dallas, TX:www.socialmediastrategiessummit.com/dallas-2015/",
    @"CineAsia:8th - 10th December:Hong Kong Convention & Exhibition Centre-Hong Kong, China:www.vnufilmgroup.com/cineasia",
    @"CeBIT Bilisim Eurasia:17th - 19th December:Istanbul Expo Center-Istanbul, Turkey:www.cebitbilisim.com/en/index.php"
    ];
表视图方法

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {

//Amount of sections
return 1;

}

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

//Amount of rows in each section
return [tableViewContents count];

}

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {


NSString *contentsString = tableViewContents[indexPath.row];
NSArray *contentsArray = [contentsString componentsSeparatedByString:@":"];

//Cell Identifier
static NSString *simpleIdentifier = @"simpleIdentifier";

UILabel *eventNameLabel;
UILabel *eventDateLabel;
UILabel *eventLocationLabel;

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleIdentifier];
if (cell == nil) {

    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleIdentifier];

    eventNameLabel = [[UILabel alloc]init];
    eventDateLabel = [[UILabel alloc]init];
    eventLocationLabel = [[UILabel alloc]init];


    eventNameLabel.frame = CGRectMake(10, 10, 300, 20);
    eventNameLabel.font = [UIFont boldSystemFontOfSize:14];
    eventNameLabel.textColor = [UIColor colorWithRed:231.0f/255.0f
                                               green:123.0f/255.0f
                                                blue:50.0f/255.0f
                                               alpha:1.0f];


    eventDateLabel.frame = CGRectMake(10, 40, 300, 20);
    eventDateLabel.font = [UIFont systemFontOfSize:12];
    eventDateLabel.textColor = [UIColor grayColor];

    eventLocationLabel.frame = CGRectMake(10, 70, 300, 20);
    eventLocationLabel.font = [UIFont systemFontOfSize:12];
    eventLocationLabel.textColor = [UIColor grayColor];

    [cell addSubview:eventNameLabel];
    [cell addSubview:eventDateLabel];
    [cell addSubview:eventLocationLabel];

}

eventNameLabel.text = contentsArray[0];
eventDateLabel.text = contentsArray[1];
eventLocationLabel.text = contentsArray[2];


//Return Cell
return cell;

}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return 100;
}


提前感谢您的帮助

eventnamelab
,对于重复使用的单元格,另外两个标签是
nil
,因此您永远不会根据需要更新标签

您需要在
if
中添加一个
else
语句,将三个标签变量设置为现有单元格中的标签


当然,更好的方法是为三个标签使用具有三个属性的自定义单元格类。不要将所有逻辑都放在视图控制器中。它属于单元类。

eventnamelab
,对于重用的单元,其他两个标签为
nil
,因此您永远不会根据需要更新标签

您需要在
if
中添加一个
else
语句,将三个标签变量设置为现有单元格中的标签


当然,更好的方法是为三个标签使用具有三个属性的自定义单元格类。不要将所有逻辑都放在视图控制器中。它属于cell类。

您的代码无法按编写的方式工作。想想看。CellForRowatingIndexPath方法有3个局部变量eventNameLabel、eventDateLabel和eventLocationLabel。如果您创建一个新的单元格,那么这些变量将指向您的标签

但是,如果回收现有单元格,这些变量将为零

你需要另一种方法才能找到标签。在创建单元时为它们指定标记,然后在处理回收单元的代码中使用这些标记查找标签,怎么样

编辑:
或者,正如rmaddy在他的答案(比我的答案快1分钟)中所建议的那样,使用自定义单元格类,其中单元格具有链接到标签的IBOutlet属性。

您的代码无法按编写的方式工作。想想看。CellForRowatingIndexPath方法有3个局部变量eventNameLabel、eventDateLabel和eventLocationLabel。如果您创建一个新的单元格,那么这些变量将指向您的标签

但是,如果回收现有单元格,这些变量将为零

你需要另一种方法才能找到标签。在创建单元时为它们指定标记,然后在处理回收单元的代码中使用这些标记查找标签,怎么样

编辑:
或者,正如rmaddy在他的答案中所建议的,比我的答案快1分钟,使用自定义单元格类,其中单元格的IBOutlet属性链接到标签。

您可以尝试在界面中放置3个标签,这将允许您访问单元格中的标签。放进去

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
-


这样,您也不必添加子视图。另一种方法是,你可以创建一个UITableViewCell类,你可以链接到单元格,然后像在视图控制器中一样控制将标签拖动到单元格类文件。

你可以尝试在界面中放置3个标签,这样你就可以访问单元格中的标签。放进去

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
-


这样,您也不必添加子视图。另一种方法是你可以创建一个UITableViewCell类,你可以链接到该单元格,然后像在视图控制器中一样控制将标签拖动到单元格类文件中。

对于你的要求,最明显的答案是自定义单元格。不要在cellforrowaatIndexpath方法中进行所有编码,而是根据需要自定义单元格并将其用于表。处理自定义单元格会容易得多。有关如何自定义tableViewCell的信息,请参考这些链接。或用于自定义单元格。

对于您的要求,最明显的答案是自定义单元格。不要在cellforrowaatIndexpath方法中进行所有编码,而是根据需要自定义单元格并将其用于表。处理自定义单元格会容易得多。有关如何自定义tableViewCell的信息,请参考这些链接。或用于自定义单元格。

不要根据子视图的索引获取子视图。这很容易改变。为每个标签指定自己的标签号,并根据标签获取子视图。或者更好的做法是创建一个UtableViewCell的自定义子类,该子类具有标签的出口,并以这种方式引用它们(正如rmaddy在其回答中所建议的)。不要根据子视图的索引获取子视图。这很容易改变。为每个标签指定自己的标签号,并根据标签获取子视图。或者更好的做法是创建一个UITableViewCell的自定义子类,该子类具有标签的出口,并以这种方式引用它们(正如rmaddy在回答中所建议的)