Как сделать класс делегатом для другого? - PullRequest
1 голос
/ 07 марта 2011

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

В тестовом приложении у меня есть viewcontroller с IUbutton и другой UITableViewcontroller. Я хочу, чтобы TableViewController отображался при нажатии кнопки.

проблема в том, что объект окна не идентифицирован в этом ViewController.

[self.window addSubview:viewController.view]; эта строка показывает ошибки.

Думаю, мне следует делегировать appdelagate моему viewcontroller? как сделать?

Ответы [ 4 ]

1 голос
/ 07 марта 2011

Добавьте это в applicationDidFinishLaunching метод приложения-делегата

[self.window addSubview:viewController.view];

Или, если вы хотите получить доступ к главному окну в контроллере представления, вы можете обратиться по этой ссылке

Ссылка на переменные экземпляра AppDelegate

0 голосов
/ 07 марта 2011

Я бы провел вас через это в учебнике.
1) Создайте новый проект в xcode, используя шаблон приложения view
2) Откройте файл xib вашего представления
3) Перетащите UITableView и UIButtonиз библиотеки в представление.
4) Выберите представление UITableView и проверьте скрытое свойство.
5) Перейдите в файл заголовка своего представления и объявите два IBOutlets (для вашей кнопки и таблицы), 1 IBAction (для вашегоцелевое действие кнопки).
6) Свяжите розетки с соответствующими объектами пользовательского интерфейса в Интерфейсном Разработчике и установите целевое действие кнопки (событие касания) для вашего контроллера.
7) В IBAction установитескрытое свойство UITableView для NO и скрытое свойство кнопки для YES.
8) Volia, вы должны увидеть ваш табличный вид сейчас, когда вы нажимаете на кнопку, и кнопка станет скрытой после нажатия

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

РЕДАКТИРОВАТЬ: В свой IBAction для кнопки, поместите что-то похожее на это
- Требуется контроллер навигации: [self.navigationController pushViewController:putTheNameOfYourTableViewControllerHere animated:YES];
- Присутствует в модальном представлении:
[self presentModalViewController:putTheNameOfYourTableViewControllerHere animated:YES];

0 голосов
/ 07 марта 2011

Я просто скопировал и вставил этот код из моего проекта. Я создал делегата в этом классе "appImageDidLoad", который этот делегат вызывал, когда изображение загружалось полностью.Надеюсь, это поможет вам оставить комментарий, если вам нужны какие-либо объяснения

#import "MixtapeInfo.h"

@class Record;

@protocol IconDownloaderDelegate;

@interface IconDownloader : NSObject
{
    MixtapeInfo *appRecord;
    NSIndexPath *indexPathInTableView;
    id <IconDownloaderDelegate> delegate;
    NSMutableData *activeDownload;
    NSURLConnection *imageConnection;
}

@property (nonatomic, retain) MixtapeInfo *appRecord;
@property (nonatomic, retain) NSIndexPath *indexPathInTableView;
@property (nonatomic, assign) id <IconDownloaderDelegate> delegate;
@property (nonatomic, retain) NSMutableData *activeDownload;
@property (nonatomic, retain) NSURLConnection *imageConnection;

- (void)startDownload;
- (void)cancelDownload;

@end

@protocol IconDownloaderDelegate 

- (void)appImageDidLoad:(NSIndexPath *)indexPath;

@end





#import "IconDownloader.h"
#import "MixtapeInfo.h"

#define kAppIconHeight 48
#define TMP NSTemporaryDirectory()

@implementation IconDownloader

@synthesize appRecord;
@synthesize indexPathInTableView;
@synthesize delegate;
@synthesize activeDownload;
@synthesize imageConnection;

#pragma mark

- (void)dealloc
{
    [appRecord release];
    [indexPathInTableView release];

    [activeDownload release];

    [imageConnection cancel];
    [imageConnection release];

    [super dealloc];
}

- (void)startDownload
{
    self.activeDownload = [NSMutableData data];

    // alloc+init and start an NSURLConnection; release on completion/failure
    NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:
                             [NSURLRequest requestWithURL:
                              [NSURL URLWithString:appRecord.mixtape_image]] delegate:self];
    self.imageConnection = conn;
    [conn release];

}

- (void)cancelDownload
{
    [self.imageConnection cancel];
    self.imageConnection = nil;
    self.activeDownload = nil;
}


#pragma mark -
#pragma mark Download support (NSURLConnectionDelegate)

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    [self.activeDownload appendData:data];
}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
    // Clear the activeDownload property to allow later attempts
    self.activeDownload = nil;

    // Release the connection now that it's finished
    self.imageConnection = nil;
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{   
    // Set appIcon and clear temporary data/image
    UIImage *image = [[UIImage alloc] initWithData:self.activeDownload];
    self.appRecord.mixtape_image_obj = image;

    self.activeDownload = nil;
    [image release];

    // Release the connection now that it's finished
    self.imageConnection = nil;

    // call our delegate and tell it that our icon is ready for display
    [delegate appImageDidLoad:self.indexPathInTableView];
}

@end
0 голосов
/ 07 марта 2011

вы не можете получить доступ к окну самостоятельно, вам нужен объект класса appDelegate

, поэтому код, подобный этому

yourAppDelegate *objDelegate=(yourAppDelegate *)[[UIApplication sharedApplication] delegate];

, теперь вы можете получить доступ к окну,

[objDelegate.window addSubview:viewController.view];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...