Задайте UITableView Delegate и DataSource

Това е моят проблем: имам този малък UITableView в моя сториборд:въведете описание на изображението тук

И това е моят код:

SmallTableViewController.h

#import <UIKit/UIKit.h>
#import "SmallTable.h"

@interface SmallViewController : UIViewController

@property (weak, nonatomic) IBOutlet UITableView *myTable;

@end

SmallTableViewController.m

#import "SmallViewController.h"

@interface SmallViewController ()

@end

@implementation SmallViewController
@synthesize myTable = _myTable;

- (void)viewDidLoad
{
    SmallTable *myTableDelegate = [[SmallTable alloc] init];
    [super viewDidLoad];
    [self.myTable setDelegate:myTableDelegate];
    [self.myTable setDataSource:myTableDelegate];

    // Do any additional setup after loading the view, typically from a nib.
}

- (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}

@end

Сега, както можете да видите, искам да задам екземпляр, наречен myTableDelegate, като делегат и DataSource на myTable.

Това е източникът на класа SmallTable.

SmallTable.h

#import <Foundation/Foundation.h>

@interface SmallTable : NSObject <UITableViewDelegate , UITableViewDataSource>

@end

SmallTable.m

@implementation SmallTable

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    // Return the number of sections.
    return 0;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    // Return the number of rows in the section.
    return 5;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    // Configure the cell...
    cell.textLabel.text = @"Hello there!";

    return cell;
}

#pragma mark - Table view delegate

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSLog(@"Row pressed!!");
}

@end

Приложих всички UITableViewDelegate и UITableViewDataSource методи, от които се нуждае приложението. Защо просто се срива, преди да се появи изгледът??

Благодаря!!


person Marco Manzoni    schedule 29.06.2012    source източник
comment
Можете ли да добавите и регистрационни файлове за сривове?   -  person rishi    schedule 29.06.2012
comment
Проверете дискусията в нишката - stackoverflow. com/questions/254354/   -  person rishi    schedule 29.06.2012
comment
@Marco Manzoni: Получихте ли решение за това?   -  person Gaurav Borole    schedule 06.01.2015


Отговори (5)


рикстър е прав. Но предполагам, че трябва да използвате квалификатор strong за вашето свойство, тъй като в края на вашия viewDidLoad метод обектът така или иначе ще бъде освободен.

@property (strong,nonatomic) SmallTable *delegate;

// inside viewDidload

[super viewDidLoad];
self.delegate = [[SmallTable alloc] init];    
[self.myTable setDelegate:myTableDelegate];
[self.myTable setDataSource:myTableDelegate];

Но има ли причина да използвате отделен обект (източник на данни и делегат) за вашата таблица? Защо не зададете SmallViewController както като източник, така и като делегат за вашата таблица?

Освен това не създавате клетката по правилния начин. Тези редове не правят нищо:

static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

// Configure the cell...
cell.textLabel.text = @"Hello there!";

dequeueReusableCellWithIdentifier просто извлича от "кеша" на таблицата клетка, която вече е създадена и която може да се използва повторно (това за да се избегне потреблението на памет), но вие не сте създали такава.

Къде правиш alloc-init? Направете това вместо това:

static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if(!cell) {
    cell = // alloc-init here
}
// Configure the cell...
cell.textLabel.text = @"Hello there!";

Освен това кажете на numberOfSectionsInTableView да върне 1 вместо 0:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    // Return the number of sections.
    return 1;
}
person Lorenzo B    schedule 29.06.2012

Предполага се, че използвате ARC? Вашият myTableDelegate се споменава само в локална променлива в viewDidLoad -- след като този метод приключи, той се освобождава. (В модела делегат/източник на данни обектите не притежават своите делегати, така че препратките на табличния изглед обратно към вашия обект са слаби.) Не бих очаквал само това да причини срив, но вероятно е ключът към вашия проблем.

person rickster    schedule 29.06.2012
comment
Добре, току-що създадох нов @property (слаб, неатомичен) SmallTable *delegate; Сега приложението не се срива, но... таблицата е празна! Не мога да разбера защо... - person Marco Manzoni; 29.06.2012

setDelegate няма да задържи делегата.

И

numberOfSectionsInTableView методът трябва да върне 1 вместо 0;

person Siva    schedule 29.06.2012

(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    // Return the number of sections.
    return 0;
}

Броят на секциите трябва да бъде зададен поне един

person Softec    schedule 30.11.2013

Делегатът на обект UITableView трябва да приеме протокола UITableViewDelegate. Незадължителните методи на протокола позволяват на делегата да управлява селекции, да конфигурира заглавия и долни колонтитули на секции, помага за изтриване на методи.

въведете описание на изображението тук

person Tulasi Narayana Dumpala    schedule 19.06.2013