0

Я создаю приложение для входа. Он имеет два вида таблицы. Один из них перечисляет людей, которые посещали ранее (existingNames), и в списке перечислены текущие люди, подписавшиеся (имена).Почему мои изменчивые массивы и представления таблиц ведут себя неожиданно?

В некоторых случаях в моем коде единственный измененный массив, который не разбивает программу при доступе, это имена.

имена и existingNames, похоже, как-то обращаются вспять. Когда я пытаюсь удалить из имен, программа выйдет из строя. Когда я удаляю из existingNames, изменения отражаются в tableView2, но tableView2 должен быть связан с именами.

В текущем состоянии приложения все работает, за исключением доступа к любым корпоративным массивам. Я помещаю кавычки вокруг работы из-за того, что имена и existingNames используются назад.

Любое понимание того, что может вызвать проблему, было бы высоко оценено!

.h:

#import <UIKit/UIKit.h> 

@interface ViewController : UIViewController <UITableViewDataSource, UITableViewDelegate>{ 
    UITableView *tableView; 
} 

@property (weak, nonatomic) IBOutlet UITextField *nameField; 
@property (weak, nonatomic) IBOutlet UITextField *companyField; 
@property (nonatomic, retain) NSMutableArray *names; 
@property (nonatomic, retain) NSMutableArray *companies; 
@property (nonatomic, retain) NSMutableArray *existingNames; 
@property (nonatomic, retain) NSMutableArray *existingCompanies; 

- (IBAction)add:(id)sender; 
- (IBAction)addExisting:(id)sender; 
- (IBAction)remove:(id)sender; 
- (IBAction)submit:(id)sender; 

@property (strong, nonatomic) IBOutlet UITableView *tableView1; 
@property (weak, nonatomic) IBOutlet UITableView *tableView2; 

@end 

.m:

#import "ViewController.h" 
#import <MessageUI/MessageUI.h> 

@interface ViewController() <MFMailComposeViewControllerDelegate> 

@end 

@implementation ViewController 

@synthesize nameField; 
@synthesize companyField; 
@synthesize names; 
@synthesize companies; 
@synthesize existingNames; 
@synthesize existingCompanies; 
@synthesize tableView1 = _tableView1; 
@synthesize tableView2 = _tableView2; 

int rowNumber1; 
int rowNumber2; 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    self.names = [[NSMutableArray alloc] init]; 
    self.companies = [[NSMutableArray alloc] init]; 
    self.existingNames = [[NSMutableArray alloc] init]; 
    self.existingCompanies = [[NSMutableArray alloc] init]; 
    // Do any additional setup after loading the view, typically from a nib. 
} 

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    if (tableView == self.tableView1){ 
     return [existingNames count]; 
    } 
    else if (tableView == self.tableView2){ 
     return [names count]; 
    } 
    return 0; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *simpleTableIdentifier = @"SimpleTableItem"; 
    UITableViewCell *cell; 

    if (tableView == self.tableView1){ 
     cell = [_tableView1 dequeueReusableCellWithIdentifier:simpleTableIdentifier]; 
    } 
    else if (tableView == self.tableView2){ 
     cell = [_tableView2 dequeueReusableCellWithIdentifier:simpleTableIdentifier]; 
    } 

    if (cell == nil) { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleTableIdentifier]; 
    } 

    if (tableView == self.tableView1){ 
     cell.textLabel.text = [existingNames objectAtIndex:indexPath.row]; 
    } 
    else if (tableView == self.tableView2){ 
     cell.textLabel.text = [names objectAtIndex:indexPath.row]; 
    } 
    return cell; 
} 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ 
    if (tableView == self.tableView1){ 
     rowNumber1 = indexPath.row; 
    } 
    else if (tableView == self.tableView2){ 
     rowNumber2 = indexPath.row; 
    } 
} 

- (IBAction)add:(id)sender { 
    BOOL exists = [existingNames containsObject:nameField.text]; 

    if(exists == FALSE){ 
     [names addObject:nameField.text]; 
     [companies addObject:companyField.text]; 
     [existingNames addObject:nameField.text]; 
     [existingCompanies addObject:companyField.text]; 
    } 
    else{ 
     [names addObject:nameField.text]; 
     [companies addObject:companyField.text]; 
    } 

    [_tableView1 reloadData]; 
    [_tableView2 reloadData]; 

    [email protected]""; 
    [email protected]""; 
} 

- (IBAction)addExisting:(id)sender { 
    [existingNames addObject:[names objectAtIndex:rowNumber1]]; 
    //[companies addObject:[existingCompanies objectAtIndex:rowNumber]]; 

    [_tableView2 reloadData]; 
} 

- (IBAction)remove:(id)sender { 
    [existingNames removeObjectAtIndex:rowNumber2]; 
    [existingCompanies removeObjectAtIndex:rowNumber2]; 

    [_tableView2 reloadData]; 
} 

@end 

ответ

1

Следующие методы являются частью UITableViewDataSource и UITableViewDelegate протоколов

tableView:numberOfRowsInSection: 
tableView:cellForRowAtIndexPath: 
tableView:didSelectRowAtIndexPath: 

и будет называться вашим табличном если у вас есть свойство, назначенное табличное представление delegate и dataSource Недвижимость. Эти методы, однако,

tableView2:numberOfRowsInSection: 
tableView2:cellForRowAtIndexPath: 
tableView2:didSelectRowAtIndexPath: 

не являются частью протокола и никогда не будут вызваны табличным видом. Похоже, вы можете вводить в заблуждение имена своих свойств, например. tableView, с именами протокольных методов, например. tableView:numberOfRowsInSection:. Что вам нужно сделать, это:

  1. Если вы еще не сделали этого, установите контроллер представления в качестве delegate и dataSource как для вашего tableView и tableView2.
  2. В каждом из методов источника данных и делегата, которые необходимо реализовать, обрабатывайте случаи для обеих таблиц.

Например, ваш метод tableView:numberOfRowsInSection: будет выглядеть так:

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    if (tableView == self.tableView) { 
     return [existingNames count]; 
    } 

    else if (tableView == self.tableView2) { 
     return [names count]; 
    } 

    return 0; 
} 
+0

Я установил источник данных и делегат для обоих взглядов таблицы уже. Благодарим вас за помощь в работе с документами tableview. Они действительно очень много! Я поработаю над этим и дам вам знать, если что-нибудь улучшится. –

+0

Я уже давно это делаю, и у меня запущена программа, только теперь таблицы не заполняются. Я отправляю свой новый код. Я предполагаю, что это имеет какое-то отношение к методам tableview. Я получаю предупреждение каждый раз, когда ссылаюсь на tableView внутри этих методов: «Локальная декларация tableView скрывает переменную экземпляра». Я пробовал другие методы, чтобы удалить это предупреждение, но ничего больше не сработало. –

+0

Ahh, я избавился от него, добавив _ в объявление метода (т. Е. - (NSInteger) tableView: (UITableView *) _ tableView numberOfRowsInSection: (NSInteger)). В настоящее время мои представления в таблице все еще не заполнены. Какие-либо предложения? –

Смежные вопросы