2014-02-13 4 views
0

Я новичок в Objective-C, и я пытаюсь понять делегатов. Я много искал и читал, но мне ничего не помогает. Я думаю, что лучший способ понять это может задавать вопрос с образцовым приложением.Делегат в Objective-C

Я пытаюсь создать приложение калькулятора оценки, чтобы проверить свои навыки. Вот мои файлы:

mainTableViewController.h

#import <UIKit/UIKit.h> 

@interface mainTableViewController : UITableViewController 

@end 

mainTableViewController.m

#import "mainTableViewController.h" 
#import "addLectureViewController.h" 


@interface mainTableViewController() 

@end 

@implementation anaTableViewController 

- (id)initWithStyle:(UITableViewStyle)style 
{ 
    self = [super initWithStyle:style]; 
    if (self) { 
     // Custom initialization 
    } 
    return self; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
} 

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
} 

#pragma mark - Table view data source 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 
    return 1; 
} 

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

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

    return cell; 
} 

@end 

addLectureViewController.h

#import <UIKit/UIKit.h> 

@interface addLectureViewController : UIViewController 
@property (weak, nonatomic) IBOutlet UITextField *lectureNameTextField; 
- (IBAction)addButtonPressed:(id)sender; 

@property NSMutableArray *lectureName; 
@property NSObject *lecture; 

@end 

addLectureViewController.m

#import "addLectureViewController.h" 

@interface addLectureViewController() 

@end 

@implementation addLectureViewController 

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 
     // Custom initialization 
    } 
    return self; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    _lectureName = [[NSMutableArray alloc] init]; 
    _lecture = [[NSObject alloc] init]; 
} 

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 

} 

- (IBAction)addButtonPressed:(id)sender { 

    _lecture = _lectureNameTextField.text; 
    [_lectureName addObject:_lecture]; 
    NSLog(@"%@",_lectureName); 


} 
@end 

Все в порядке до сих пор. Но когда я пытаюсь использовать _lectureNameNSMutableArray в mainTableViewController.m, я не вижу массив.

Я знаю коды для печати массива в таблицеView. Я знаю, что их сейчас нет. Я просто не понимаю, как реализовать код делегата для моего кода.

+0

Почему вы указали код 'anaTableViewController', если он не используется нигде? – trojanfoe

+0

но где делегаты? – HRM

+0

Вы имеете в виду, что хотите передать данные ** _ lectureName ** на ** mainTableViewController ** ?? – iamyogish

ответ

2

Если Вы хотите отобразить что-то на строках таблицы, Вы можете взять NSArray и вы должны вернуть счетчик массива в методе делегата:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
return array.count; 
} 

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

Вы можете взять ссылку из этих ссылок, чтобы понять делегатов: http://www.tutorialspoint.com/ios/ios_delegates.htm

How do I set up a simple delegate to communicate between two view controllers?

http://code.tutsplus.com/tutorials/ios-sdk-custom-delegates--mobile-10848

Но в случае Tableview, методы делегата внутренне определены и срабатывает внутри. Нам просто нужно назначить этих делегатов контроллеру, который действует как слушатель.

+0

Спасибо, но я знаю, что я просто забыл записать его там. Что я сейчас редактировал. Я просто хочу понять, что коды делегатов. Какие коды следует писать для делегирования моего массива на другую страницу? Я был бы очень рад, если вы сможете мне помочь. Благодарю. – burakkesepara

+0

Я отредактировал свой ответ. Посмотри на это. Методы делегатов UITableView предопределены и вызывается, как только вы устанавливаете tableview.delegate = self. Это в основном механизм обратного вызова. –

+0

Я не мог видеть отредактированный ответ чувак? – burakkesepara

0

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

Внести следующие изменения: -

mainTableViewController.h

#import <UIKit/UIKit.h> 

@interface mainTableViewController : UITableViewController 
@property(strong, nonatomic) NSMutableArray *lectureName 
@end 

Синтезировать свойство lectureName в mainTableViewController.m

Затем сделайте следующие изменения в addLectureViewController.ч

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

@interface addLectureViewController : UIViewController 
@property (weak, nonatomic) IBOutlet UITextField *lectureNameTextField; 
- (IBAction)addButtonPressed:(id)sender; 
@property(weak, nonatomic) id<mainTableViewController> delegate; 
@property NSMutableArray *lectureName; 
@property NSObject *lecture; 

@end 

Синтезировать свойство делегата addLectureViewController.m

Затем сделайте следующие изменения: -

- (IBAction)addButtonPressed:(id)sender { 

    _lecture = _lectureNameTextField.text; 
    [_lectureName addObject:_lecture]; 
    NSLog(@"%@",_lectureName); 
    delegate.lectureName=_lectureName; 
} 

Предполагая, что вы толкая addLectureViewController из mainTableViewController, также включают в себя следующий код в prepareForSegue mainTableViewController (или любой другой способ, которым вы нажимаете addLectureViewController). : -

addLectureViewController *vc=[[addLectureViewController alloc] init]; 
vc.delegate=self; 
// Push vc 

Приведенный выше код фактически создает слабое свойство типа id<mainTableViewController> называется делегат (слабый, чтобы предотвратить эталонные циклов). Таким образом, addLectureViewController может обновить свойство mainTableViewController.

0

Очки:

  1. Почему класс в mainTableViewController.m имени anaTableViewController. Это должно быть mainTableViewController (почти всегда, пока вы не получите более продвинутый).

  2. mainTableViewController и addLectureViewController следует начинать с заглавных букв.

  3. Единственный способ для mainTableViewController для доступа lecture - через объект addLectureViewController, например.

    addLectureViewController *alvc = // *something* here 
    NSArray *localLecture = [alvc lecture]; 
    


    Выяснить, как у вас есть доступ к addLectureViewController и вы решили вашу проблему.

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