2014-01-28 3 views
0

У меня есть два контроллера вида, HomeViewController (далее HVC) и AddActivityViewController (далее AAVC). В AAVC я объявил протокол делегата:iOS Использование необъявленного идентификатора в протоколе?

@protocol AddActivityViewControllerDelegate; 

и определил его таким образом:

@protocol AddActivityViewControllerDelegate 


-(void) addActivityViewControllerDidSave; 

-(void) addActivityViewControllerDidCancel:(ListActivity *) activityToDelete; 

@end 

Далее я реализовал два метода в HVC (делегат), как это:

-(void) addActivityViewControllerDidSave 
    { 
     [self.moc MR_saveToPersistentStoreAndWait]; 
     [self.navigationController dismissViewControllerAnimated:YES completion:nil]; 
    } 

-(void) addActivityViewControllerDidCancel:(ListActivity *) activityToDelete 
    { 
     [activityToDelete MR_deleteEntity]; 
     [self.navigationController dismissViewControllerAnimated:YES completion:nil];   
    } 

Я получаю эту ошибку «Использование необъявленного идентификатора« addActivityViewControllerDidSave », хотя это четко указано в протоколе.

Я должен упомянуть, что до этого я имел дело с тем, что было, по-видимому, «циклом импорта», что вызвало ошибку «необъявленного протокола». Эта ошибка, похоже, исправлена.

Вот операторы @import из файла HomeViewController.h:

#import <UIKit/UIKit.h> 
#import "ListActivity.h" 
#import "AddActivityViewController.h" 
#import "TimedActivity.h" 

@interface HomeViewController : UIViewController <AddActivityViewControllerDelegate> 

@property (strong, nonatomic) IBOutlet UITableView *myTableView; 

@property NSManagedObjectContext * moc; 

- (IBAction)dumpMemory:(UIButton *)sender; 
@end 

И из файла AddActivityViewController.h:

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

@protocol AddActivityViewControllerDelegate; 


@interface AddActivityViewController : UIViewController 

@property (weak, nonatomic) IBOutlet UITextField *activityField; 
@property (weak, nonatomic) IBOutlet UITextField *categoryField; 

@property (strong, nonatomic) ListActivity *thisActivity; 

@property (nonatomic, weak) id <AddActivityViewControllerDelegate> delegate; 

- (IBAction)saveButton:(UIBarButtonItem *)sender; 
- (IBAction)cancelButton:(UIBarButtonItem *)sender; 

@end 

@protocol AddActivityViewControllerDelegate 


-(void) addActivityViewControllerDidSave; 

-(void) addActivityViewControllerDidCancel:(ListActivity *) activityToDelete; 

@end 

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

Большое спасибо за помощь!

Edit: Вот полный код из HomeViewController.m:

// 
// HomeViewController.m 
// MRExample 
// 
// Created by Tim Jones on 1/15/14. 
// Copyright (c) 2014 TDJ. All rights reserved. 
// 

#import "HomeViewController.h" 
#import "ListActivity.h" 

@interface HomeViewController() 

{ 
    NSFetchedResultsController *frc; 
} 


@end 

@implementation HomeViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 
    self.automaticallyAdjustsScrollViewInsets = NO; 

    [self refreshData]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notificationNewActivityAdded:) name:@"newActivityAdded" object:nil]; 

} 

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

-(void) notificationNewActivityAdded:(NSNotification*)notification 
{ 
    [self refreshData]; 
} 



#pragma mark Table View data source 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 
    return [[frc sections] count]; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    id<NSFetchedResultsSectionInfo> sectionInfo = [[frc sections] objectAtIndex:section]; 
    return [sectionInfo numberOfObjects]; 
} 

// Customize the appearance of table view cells. 
- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath { 

    // Configure the cell to show the activity's name 
    ListActivity *thisActivity = [frc objectAtIndexPath:indexPath]; 
    cell.textLabel.text = thisActivity.activityName; 
} 


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

    [self configureCell:cell atIndexPath:indexPath]; 

    cell.textLabel.textColor = [UIColor redColor]; 
    NSAttributedString *attString; 
    attString = cell.textLabel.attributedText; 
    return cell; 
} 


//  Section Label 

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section 
{ 
    NSString *sectionLabel = [[[frc sections] objectAtIndex:section]name]; 
    return [sectionLabel uppercaseString]; 
} 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    NSManagedObjectContext *localContext = [NSManagedObjectContext MR_contextForCurrentThread]; 
    ListActivity *thisActivity = [frc objectAtIndexPath:indexPath]; 

    TimedActivity *currentActivity = [TimedActivity MR_createInContext:localContext]; 
    currentActivity.timedActivityName = thisActivity.activityName; 
    currentActivity.category = thisActivity.activityCategory; 
    currentActivity.timedActivityTapped = [NSDate date]; 
    [localContext MR_saveToPersistentStoreAndWait]; 

} 

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if (editingStyle == UITableViewCellEditingStyleDelete) 
    { 
     NSManagedObjectContext *localContext = [NSManagedObjectContext MR_contextForCurrentThread]; 
     ListActivity *activityToTrash = [frc objectAtIndexPath:indexPath]; 
     // Delete the row from the data source 
     [activityToTrash MR_deleteEntity]; 
     [localContext MR_saveToPersistentStoreAndWait]; 
     [self refreshData]; 
    } 
} 


-(void) refreshData 
{ 
    //This was the turning point for proper MR grouping. The two Properties (activityCategory and activityName) are used as Sort descriptors in the underlying core data methods 
    frc = [ListActivity MR_fetchAllSortedBy:@"activityCategory,activityName" ascending:YES withPredicate:nil groupBy:@"activityCategory" delegate:nil]; 

    [self.myTableView reloadData]; 
} 



- (IBAction)dumpMemory:(UIButton *)sender 
{ 
    NSManagedObjectContext *localContext = [NSManagedObjectContext MR_contextForCurrentThread]; 
    [ListActivity MR_truncateAllInContext:localContext]; 
    [localContext MR_saveToPersistentStoreAndWait]; 

    [self refreshData]; 
} 

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    NSManagedObjectContext *localContext = [[NSManagedObjectContext alloc] init]; 
    if ([[segue identifier] isEqualToString:@"addActivity"]) 
    { 
     AddActivityViewController *aavc = (AddActivityViewController *) [segue destinationViewController]; 
     aavc.delegate = self; 
     ListActivity *newActivity = [ListActivity MR_createInContext:localContext]; 
     aavc.thisActivity = newActivity; 
    } 

-(void) addActivityViewControllerDidSave 
    { 
     [self.moc MR_saveToPersistentStoreAndWait]; 
     [self.navigationController dismissViewControllerAnimated:YES completion:nil]; 
    } 

-(void) addActivityViewControllerDidCancel:(ListActivity *) activityToDelete 
    { 
     [activityToDelete MR_deleteEntity]; 
     [self.navigationController dismissViewControllerAnimated:YES completion:nil];   
    } 


} 
@end 
+0

Какая строка содержит сообщение об ошибке? –

+0

- (void) addActivityViewControllerDidSave – rattletrap99

+0

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

ответ

5

Хорошо, так же, как я думал. Проблема в том, что в конце метода - (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender отсутствует скобка «}». Также у вас есть дополнительный кронштейн в конце класса (прямо над ключевым словом @end). Вероятно, это недостающая скобка. Исправьте это, и ваша проблема исчезнет.

Надеюсь, это поможет!

+0

Вот и все! Мужчина, я бы хотел, чтобы компилятор сказал «Missing»} «скобка вместо того, что она говорила. :) – rattletrap99

0

Я не знаю, если это проблема, но переместить декларацию делегата (с @class директивы) в верхней части AddActivityViewController, как это:

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

@class AddActivityViewController; 

@protocol AddActivityViewControllerDelegate 
- (void)addActivityViewControllerDidSave; 
- (void)addActivityViewControllerDidCancel:(ListActivity *) activityToDelete; 
@end 

@interface AddActivityViewController : UIViewController 

@property (nonatomic, weak) id <AddActivityViewControllerDelegate> delegate; 
@property (nonatomic, weak) IBOutlet UITextField *activityField; 
@property (nonatomic, weak) IBOutlet UITextField *categoryField; 
@property (nonatomic, strong) ListActivity *thisActivity; 

- (IBAction)saveButton:(UIBarButtonItem *)sender; 
- (IBAction)cancelButton:(UIBarButtonItem *)sender; 

@end 

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

  • Нет связанных вопросов^_^