Как я могу выполнить код из свойства другого метода - PullRequest
0 голосов
/ 25 апреля 2011

Извините, если вопрос не ясен, это то, что я пытаюсь сделать.У меня есть объект, делегат и контроллер представления.

Псевдокод объекта

@interface Car: NSObject {
    UIColor *color;
}
@property (assign)UIColor *color;
- (void) setColor(UIColor col);
@end

@implementation Car
@synthetize color;
// i know that synthesize makes this function redundant. 
// I just used it to demonstrate
// the need to access an instance method.
- (void) setColor(UIColor col)
{
    color = col;
}
@end

Код делегата

@interface myDelegate: UIApplicationDelegate {
    Car *car;
    UIViewController *theView;
}
@property (assign)Car *car;
@end

@implementation myDelegate
@synthesize car;
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{    
    theView = [[MyViewController alloc]init];   

    return YES;
}

@end

Просмотр псевдокода

@interface MyViewController: UIViewController {

    MyDelegate *appDelegate;
}
@property (retain) MyDelegate *appDelegate;
@end

@implementation MyViewController
@synthesize appDelegate;

- (void)viewDidLoad {
    self.appDelegate = (MyDelegate*)[[UIApplication sharedApplication] delegate];
    /// THIS IS MY ISSUSE!
    [self.appDelegate.car setColor(UIColor);
}
@end

Может кто-нибудь объяснить или указать мне, где я могу понять, почему [self.appDelegate.car setColor ()] дает мне ошибку компиляции, которая гласит «Неизвестный компонент setColor свойства».

Я уверенесть способ сделать это в цели C, как я бы сделал это на python, java или другом языке OO.

Любая помощь будет принята с благодарностью

Cheers Rudy

Ответы [ 2 ]

1 голос
/ 25 апреля 2011

Прежде всего, у класса Car есть проблемы. Свойство color должно быть определено как retain, а не assign. assign обычно для свойств необъектного типа, таких как NSInteger, BOOL, int и т. Д., И для особого случая объектов, которые не следует сохранять, поскольку они создают циклы сохранения. Также, - (void)setColor(UIColor col); не является допустимым именем метода, так как оно написано так, как если бы оно было функцией В Objective-C каждому параметру предшествует двоеточие :.

Например, возьмите следующий метод:

 - (void)setBodyColor:bodyColor lowerColor:lowerColor upperColor:upperColor;

Хотя это технически допустимая сигнатура метода, она обычно пишется по-другому, чтобы сделать ее использование более понятным. Как определено выше, каждый параметр имеет тип id, который является универсальным типом объекта. Чтобы прояснить ситуацию, вы приводите каждый аргумент к типу объектов, которые они представляют:

 - (void)setBodyColor:(UIColor *)bodyColor
           lowerColor:(UIColor *)lowerColor
           upperColor:(UIColor *)upperColor;

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

@interface Car: NSObject {
    UIColor *color;
}
@property (retain) UIColor *color;
@end


@implementation Car

@synthetize color;

- (void)dealloc {
   [color release];
   [super dealloc];
}
// If you need to override a method, that’s fine
- (void) setColor:(UIColor *)aColor
{
    [aColor retain];
    [color release];
    color = aColor;
    // do more stuff
}
@end

У вашего делегата тоже есть проблемы. Во-первых, myDelegate определяется как подкласс UIApplicationDelegate, который даже не является классом: это протокол (или интерфейс), которому могут соответствовать другие объекты. Свойство car также должно быть определено как retain, поскольку это объект, которым владеет ваш делегат приложения. Здесь theView (который, вероятно, следует переименовать во что-то вроде theViewController) следует набрать как MyViewController, чтобы сделать его более понятным.

@interface MyDelegate : NSObject <UIApplicationDelegate> {
    Car *car;
    MyViewController *theView;
}
@property (retain) Car *car;
@end


@implementation MyDelegate

@synthesize car;

- (void)dealloc {
   [car release];
   [theView release];
   [super dealloc];
}

- (BOOL)application:(UIApplication *)application
    didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{    
    theView = [[MyViewController alloc] init];   

    return YES;
}

@end

Класс MyViewController имеет проблемы в том, что appDelegate определяется как retain, когда он, вероятно, должен быть assign. Сам делегат приложения создает контроллер представления с использованием alloc / init, то есть делегат приложения «владеет» контроллером представления. Контроллер представления не должен сохранять делегат приложения, потому что это создаст цикл сохранения (см. Retain Cycles ).

MyViewController.h

// forward declaration
@class MyDelegate;

@interface MyViewController: UIViewController {
    MyDelegate *appDelegate;  // non-retained
}
@property (assign) MyDelegate *appDelegate;
@end

MyViewController.m

#import "MyViewController.h"
#import "MyDelegate.h"

@implementation MyViewController

@synthesize appDelegate;

- (void)viewDidLoad {
    self.appDelegate = (MyDelegate*)[[UIApplication sharedApplication] delegate];
    [self.appDelegate.car setColor:[UIColor clearColor]];
    /// THIS IS MY ISSUSE!
    // [self.appDelegate.car setColor(UIColor);
}
@end
1 голос
/ 25 апреля 2011

Вы не используете UIColor в качестве указателя.

Попробуйте использовать UIColor * вместо UIColor, и компилятор перестанет жаловаться

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