Как перезагрузить содержимое табличного представления зависит от индекса сегмента - PullRequest
1 голос
/ 20 ноября 2011

я пошел, содержание изменения представления таблицы зависит от SegmentIndex

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

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];     
    }

    // Set up the cell
    book *bok = (book *)[self.booktable objectAtIndex:indexPath.row];

    NSArray *rowoftitle = [NSArray arrayWithObjects:bok.book_title, nil];
    NSArray *rowofauth = [NSArray arrayWithObjects:bok.author_name, nil];
    NSArray *rowofpub = [NSArray arrayWithObjects:bok.pub_name, nil];

    //[cell setText:bok.book_title];
    [tableView beginUpdates];

    switch (segControl.selectedSegmentIndex) 
    {
        case 0:
        [tableView insertRowsAtIndexPaths:rowoftitle withRowAnimation:UITableViewRowAnimationTop];

        //cell.textLabel.text =bok.book_title; 
        break;

    case 1:
        [tableView insertRowsAtIndexPaths:rowofauth withRowAnimation:UITableViewRowAnimationTop];


        //[libraryTV reloadData];
        //cell.textLabel.text =bok.author_name;
        break;
    case 2:
        [tableView insertRowsAtIndexPaths:rowofpub withRowAnimation:UITableViewRowAnimationTop];

        //cell.textLabel.text =bok.pub_name;
        break;

    default:
        break;          
}

    [tableView endUpdates];
    //return cell;  
}

, но при запуске его происходит истечение:

'NSInvalidArgumentException', причина: '- [NSCFString row]: нераспознанный селектор, отправленный экземпляру 0x5d84f80

как решить.

Ответы [ 3 ]

1 голос
/ 21 ноября 2011

Одним из решений может быть:

Вам потребуется использовать общий источник данных (в этом коде я использую dataSourceArray для этой цели, вам нужно будет объявить его в заголовке файл и alloc / init в методе viewDidLoad.) , который будет обновляться при смене сегмента.Он будет иметь следующий метод. (Для события изменения сегмента)

-(void)segmentSelected:(UISegmentedControl *)sender
{
    switch (sender.selectedSegmentIndex)
    {
        case 0:
            [self loadTitles];
            break;
        case 1:
            [self loadAuthors];
            break;
        case 2:
            [self loadPublishers];
            break;
        default:
            break;
    }
}




- (void) loadTitles
{
    [self.dataSourceArray removeAllObjects];
    for (Book *book in self.booktable) 
    {
        [dataSourceArray addObject:book.book_title];
    }
    [<yourTableViewVariable> reloadData];
}

Аналогично, код для других методов loadAuthors и loadPublishers.

Теперь ваш метод numberOfRowsInSection будет:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [dataSourceArray count];
}

и cellForRowAtIndexPath будут:

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

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];     
    }

    // Set up the cell
    cell.textLabel.text = [dataSourceArray objectAtIndex:indexPath.row];
    return cell;  
}

Спасибо

0 голосов
/ 22 ноября 2011

в интерфейсе:

NSMutableArray *booktable;
NSMutableArray *sbook;  
NSMutableArray *rowoflibrary;
NSString *databaseName;
NSString *databasePath;
IBOutlet UISegmentedControl *segControl;
IBOutlet UITableView *libraryTV;
IBOutlet UISearchBar *searchBar;

в реализации

- (void)viewDidLoad {


databaseName = @"MydataBase.db";

// Get the path to the documents directory and append the databaseName
NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDir = [documentPaths objectAtIndex:0];
databasePath = [documentsDir stringByAppendingPathComponent:databaseName];

// Execute the "checkAndCreateDatabase" function
[self checkAndCreateDatabase];

[self readbookFromDatabase];


booktable = [[NSMutableArray alloc]init];

[booktable addObjectsFromArray:sbook];

rowoflibrary = [[NSMutableArray alloc] init];

[super viewDidLoad];}


-(void) checkAndCreateDatabase{
// Check if the SQL database has already been saved to the users phone, if not then copy it over
BOOL success;

// Create a FileManager object, we will use this to check the status
// of the database and to copy it over if required
NSFileManager *fileManager = [NSFileManager defaultManager];

// Check if the database has already been created in the users filesystem
success = [fileManager fileExistsAtPath:databasePath];

// If the database already exists then return without doing anything
if(success) return;

// If not then proceed to copy the database from the application to the users filesystem

// Get the path to the database in the application package
NSString *databasePathFromApp = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:databaseName];

// Copy the database from the package to the users filesystem
[fileManager copyItemAtPath:databasePathFromApp toPath:databasePath error:nil];

[fileManager release];}

-(void) readbookFromDatabase {
// Setup the database object
sqlite3 *database;

// Init the staff Array
sbook = [[NSMutableArray alloc] init];

// Open the database from the users filessytem
if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) {
    // Setup the SQL Statement and compile it for faster access

    const char *sqlStatement ="select book.title,author.auth_name ,publisher.pub_name , book.info from book ,author, publisher where book.auth_id = author.auth_id and book.pub_id = publisher.pub_id";


    sqlite3_stmt *compiledStatement;
    if(sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) {
        // Loop through the results and add them to the feeds array
        while(sqlite3_step(compiledStatement) == SQLITE_ROW) {
            // Read the data from the result row

            char * str = (char*)sqlite3_column_text(compiledStatement, 0);
            if (str){
            title = [NSString stringWithUTF8String:str];
            }
            else{
           title =@" ";
            }

            char * str1 = (char*)sqlite3_column_text(compiledStatement, 1);
            if (str1){
                authorName = [NSString stringWithUTF8String:str1];
            }
            else{
            authorName =@" ";
            }

            char * str2 = (char*)sqlite3_column_text(compiledStatement, 2);
            if (str2){
                pubName = [NSString stringWithUTF8String:str2];
            }
            else{
        pubName =@" ";
            }

            char * str3 = (char*)sqlite3_column_text(compiledStatement,3);
            if (str3){
        info = [NSString stringWithUTF8String:str3];
            }
            else{
            info =@" ";
            }

            // Create a new book object with the data from the database

            book *bok  = [[book alloc] initWithbook:title autname:authorName pubname:pubName infobook:info];


            // Add the book object to the staff Array
            [sbook addObject:bok];

            [bok release];
        }
    }
    // Release the compiled statement from memory
    sqlite3_finalize(compiledStatement);

}
sqlite3_close(database);}

- (void) сегментSelected: (UISegmentedControl *) отправитель { switch (sender.selectedSegmentIndex) { случай 0: [self loadTitles]; перерыв; Случай 1: [self loadAuthors]; перерыв; случай 2: [self loadPublishers]; перерыв; дефолт: перерыв; }} - (void) loadTitles { [rowoflibrary removeAllObjects];

for (book *bok in self.booktable) 
{
    [rowoflibrary addObject:bok.book_title];
}
[libraryTV reloadData];

}

  • (void) loadAuthors {

    [rowoflibrary removeAllObjects];

    за (книга * бок в self.booktable) { [rowoflibrary addObject: bok.author_name]; } [libraryTV reloadData];

}

  • (void) loadPublishers {

    [rowoflibrary removeAllObjects];

    за (книга * бок в self.booktable) { [rowoflibrary addObject: bok.pub_name]; } [libraryTV reloadData];

}

Прагма Марк -

pragma mark Источник данных табличного представления

  • (NSInteger) tableView: (UITableView *) tableView numberOfRowsInSection: (NSInteger) раздел {

    return [rowoflibrary count];
    

} * * тысяча пятьдесят-один

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

    статический NSString * CellIdentifier = @ "Cell";

    UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier: CellIdentifier]; if (cell == nil) { cell = [[[UITableViewCell alloc] initWithFrame: CGRectZero reuseIdentifier: CellIdentifier] autorelease];

    }

    // Настройка ячейки

cell.textLabel.text = [rowoflibrary objectAtIndex: indexPath.row];

        return cell;

}

при запуске это пустое представление таблицы

0 голосов
/ 20 ноября 2011

Изменение содержимого означает настройку свойств ячейки из вашего источника данных на основе раздела. Это нормально, и документы Apple о том, как реализовать UITableViewController, хорошо это освещают. Вы пытаетесь изменить структуру таблицы во время перезагрузки таблицы. Вы абсолютно не можете этого сделать.

Методы модификации таблицы (например, insertRowsAtIndexPaths:withRowAnimation:) должны вызываться после того, как вы изменили модель данных и хотите динамически обновлять таблицу без перезагрузки всей таблицы. Их нельзя вызывать внутри любого метода, используемого для построения таблицы или ячеек. tableView:cellForRowAtIndexPath: будет вызываться insertRowsAtIndePaths:... для построения ячеек для новых строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...