Xcode: ДОЛЖЕН ли делегирующий объект отправлять сообщение объекту делегата? - PullRequest
0 голосов
/ 24 июня 2011

Я пытаюсь назначить SecondViewController в качестве объекта делегата FirstViewController (если я правильно понимаю).Однако FirstViewController не отправляет никаких сообщений в SecondViewController.

Могу ли я притворяться, будто SecondViewController действительно получил сообщение от FirstViewController и ответил на FirstViewController?(Примечание: мой SecondViewController отвечает за представление с кнопкой. Когда я нажимаю кнопку на представлении моего SecondViewController, я хочу, чтобы он сказал FirstViewController обновить его представление)

FirstViewController.h

#import <UIKit/UIKit.h>

@protocol FirstViewControllerDelegate <NSObject>
@optional
- (void) setAnotherLabel;
@end

@interface FirstViewController : UIViewController {
    IBOutlet UILabel *label;
    id <FirstViewControllerDelegate> delegate;
}
@property (nonatomic, retain) IBOutlet UILabel *label;
@property (nonatomic, assign) id <FirstViewControllerDelegate> delegate;
- (void) pretendLabel;
- (void) realLabel;
@end

FirstViewController.m

#import "FirstViewController.h"


@implementation FirstViewController
@synthesize label;
@synthesize delegate;


// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void) setAnotherLabel;
{
    label.text =@"Real";
    [self.view setNeedsDisplay];
}

- (void) pretendLabel;
{
    label.text =@"Pretend";
    [self.view setNeedsDisplay];
}

- (void) realLabel;
{
    [self setAnotherLabel];
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    label.text=@"Load";
    [self pretendLabel];
}
...
@end

SecondViewController.h

#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
#import "FirstViewController.h"

@interface SecondViewController : UIViewController <UIImagePickerControllerDelegate, UINavigationControllerDelegate, FirstViewControllerDelegate>
{
    UIImage *image;
    IBOutlet UIImageView *imageView;
}

- (IBAction) sendPressed:(UIButton *)sender;
- (IBAction) cancelPressed:(UIButton *)sender;
@end

SecondViewController.m

#import "SecondViewController.h"

@implementation SecondViewController

- (IBAction) sendPressed:(UIButton *)sender
{
    FirstViewController *fvc = [[FirstViewController alloc] init];
    [fvc setDelegate:self];
    //how do I find out if I'm actually the delegate for FirstViewController at this point?
    [fvc realLabel];
    self.tabBarController.selectedIndex = 0;//switch over to the first view to see if it worked
}

1 Ответ

1 голос
/ 24 июня 2011

Есть несколько проблем с этим, и это, похоже, немного путаницы.

Я предполагаю, что FirstViewController и SecondViewController находятся в отдельных вкладках в контроллере панели вкладок.

В методе sendPressed: вы создаете новый экземпляр FirstViewController - это не тот же FirstViewController, который находится в вашем контроллере панели вкладок, и поэтому вызов realLabel не имеет никакого эффекта.

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

Хорошее прочтение, чтобы разобраться с делегатами: http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/CocoaFundamentals/CommunicatingWithObjects/CommunicateWithObjects.html

Что касается решения вашей проблемы, есть несколько вариантов:

  1. Публикация уведомления от SecondViewController, за которым наблюдает FirstViewController (в сети доступно много информации об уведомлениях).
  2. Получить конкретный экземпляр FirstViewController в массиве self.tabBarController.viewControllers и вызвать метод оттуда. Что-то вроде ...
- (IBAction) sendPressed:(UIButton *)sender
{
    for(UIViewController *controller in self.tabBarController.viewControllers)
    {
        if([controller isKindOfClass:[FirstViewController class]])
        {
            FirstViewController *firstViewController = (FirstViewController *)controller;
            [firstViewController realLabel];
        }
    }

    self.tabBarController.selectedIndex = 0;//switch over to the first view to see if it worked
}

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

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

...