Невозможно отправлять данные между представлениями с использованием протокола и делегирования с помощью presentModalViewController

Я делаю штуку с лифтом. У меня возникают проблемы с отправкой данных с помощью разных представлений с использованием presentModalViewController. Я получил красное сообщение о том, что свойство "favoriteColorString" не найдено. Я скопировал точно такие же, но другие названия форм и кнопок. «favoriteColorString» появляется с ошибкой и не может отправить данные lift2.

Я пробовал две разные вещи.

  Elevator2View.favoriteColorString = [[NSString alloc] initWithFormat:@"Your favorite color is %@", favoriteColorTextField.text];

А также

  favoriteColorString = [[NSString alloc] initWithFormat:@"Your favorite color is %@", favoriteColorTextField.text];

Вот мой код:

ElevatorView.h

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

@interface ElevatorView : UIViewController<PassSecondColor>
 {

Elevator2View   *Elevator2View;

IBOutlet UITextField     *favoriteColorTextField;
IBOutlet UILabel         *favoriteColorLabel;
IBOutlet UILabel         *secondFavoriteColorLabel;

NSString        *secondFavoriteColorString;

}

@property (nonatomic, retain) Elevator2View *Elevator2View;
@property (nonatomic, retain) IBOutlet UITextField  *favoriteColorTextField;
@property (nonatomic, retain) IBOutlet UILabel      *favoriteColorLabel;
@property (nonatomic, retain) IBOutlet UILabel      *secondFavoriteColorLabel;

@property (copy) NSString   *secondFavoriteColorString;

@end

ElevatorView.m

#import "ElevatorView.h"
#import "Elevator2View.h"
    @implementation ElevatorView
@synthesize Elevator2View, favoriteColorTextField, favoriteColorLabel, secondFavoriteColorLabel;
@synthesize secondFavoriteColorString;



-(IBAction)level1:(id)sender;{
   favoriteColorTextField.text = @"1";
      Elevator2View.favoriteColorString = [[NSString alloc] initWithFormat:@"Your favorite color is %@", favoriteColorTextField.text];

      [self presentModalViewController:[[[Elevator2View alloc] init]
                                  autorelease] animated:NO];
}

Elevator2View.h

#import <UIKit/UIKit.h>

@protocol PassSecondColor <NSObject>
@required
- (void) setSecondFavoriteColor:(NSString *)secondFavoriteColor;
@end

@interface Elevator2View : UIViewController{
IBOutlet UITextField *secondFavoriteColorTextField;
IBOutlet UILabel     *favoriteColorLabel;
IBOutlet UILabel     *secondFavoriteColorLabel;
NSString             *favoriteColorString;
id <PassSecondColor> delegate;

}

@property (copy) NSString   *favoriteColorString;



@property (nonatomic, retain) IBOutlet UITextField  *secondFavoriteColorTextField;
@property (nonatomic, retain) IBOutlet UILabel      *favoriteColorLabel;
@property (nonatomic, retain) IBOutlet UILabel      *secondFavoriteColorLabel;
@property (retain) id delegate;

@end

Elevator2View.m

#import "Elevator2View.h"

@interface Elevator2View ()

@end

@implementation Elevator2View
@synthesize secondFavoriteColorTextField, favoriteColorLabel, secondFavoriteColorLabel;
@synthesize favoriteColorString;
@synthesize delegate;

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

- (void) viewWillAppear:(BOOL)animated
{
    favoriteColorLabel.text = favoriteColorString;  
}

- (void) viewWillDisappear:(BOOL) animated
{
//  [[self delegate] setSecondFavoriteColor:secondFavoriteColorTextField.text];
}


- (void)viewDidLoad
{
   [super viewDidLoad];
   // Do any additional setup after loading the view from its nib.
    favoriteColorLabel.text = favoriteColorString;  
}

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



@end

См. http://www.theappcodeblog.com/?p=90.


person HotScreen    schedule 10.04.2013    source источник
comment
1. опубликовать Elevator2Viewкод. 2.Даже если вас не волнуют соглашения об именах, пожалуйста, не называйте свои переменные так же, как классы.   -  person Kreiri    schedule 10.04.2013
comment
Вот код для Elevator2Viewcode.   -  person HotScreen    schedule 10.04.2013
comment
также (добавляя к комментарию @Kreiri) при использовании свойств также не объявляйте iVars и не синтезируйте. Всегда обращайтесь к ним, используя синтаксис свойства self.property. См. здесь для получения подробной информации. Было бы полезно, если бы вы очистили свой вопрос с помощью этих рекомендаций.   -  person foundry    schedule 11.04.2013


Ответы (1)


Причина вашего «свойства не найдена» в том, что вы назвали свой ivar таким же, как класс. Точечная нотация — это просто синтаксический сахар: object.property = value эквивалентно [object setProperty:value]. В Objective C классы также являются объектами, и когда вы вызываете Elevator2View.favoriteColorString = whatever, Xcode, по-видимому, думает, что вы пытаетесь вызвать метод класса setFavoriteColorString класса Elevator2View.

Избавиться от этой ошибки легко: просто переименуйте свой ivar Elevator2View *Elevator2View во что-то другое. На самом деле, Xcode 4.4 и новее автоматически синтезируют ивары для ваших свойств: если у вас есть свойство propertyName, то Xcode автоматически синтезирует ивары _propertyName. Ваша собственность Elevator2View будет иметь _Elevator2View ivar. Поэтому, если вам действительно не нужны ивары с другой схемой именования, вы можете избавиться от своего @synthesize, и вам также не нужно объявлять ивары для ваших свойств.

(Хотя я предпочитаю объявлять ивары для свойств (следуя схеме именования Xcode), потому что слишком часто lldb не показывает автоматически синтезированные без объявления ивары в инспекторе объектов.)

Речь шла о свойствах, иварах и соглашениях об именах. Но что вы делаете в этом коде?

-(IBAction)level1:(id)sender;{
   favoriteColorTextField.text = @"1";
      Elevator2View.favoriteColorString = [[NSString alloc] initWithFormat:@"Your favorite color is %@", favoriteColorTextField.text];

      [self presentModalViewController:[[[Elevator2View alloc] init]
                                  autorelease] animated:NO];
}

Вы устанавливаете значение свойства Elevator2View - вашей переменной экземпляра -, затем создаете новый объект Elevator2View класса и представляете это как контроллер модального представления. . (Кстати, presentModalViewController:animated: устарело в iOS 6.0). Конечно, этот новый новый объект Elevator2View понятия не имеет о свойствах Elevator2View (вашей переменной экземпляра)!

person Kreiri    schedule 11.04.2013