Как вы можете выделить класс в target-c из объекта NSString? - PullRequest
2 голосов
/ 22 июня 2009

У меня есть опыт работы с PHP, но я начинаю изучать Objective-C, чтобы разрабатывать приложения для iPhone. Пока что дела идут довольно хорошо, но у меня есть вопрос, который я не смог найти и ответить на него после поиска в Google и майнинга на нескольких различных форумах.

Мое приложение должно создать несколько представлений, каждое из которых имеет собственную строку заголовка. Для этого мой код выглядит примерно так для каждого представления:

    xViewController = [ [ XViewController alloc ] init ];
    xNavController = [ [ UINavigationController alloc ]
        initWithRootViewController: xViewController
    ];
    xNavController.tabBarItem = [ [ UITabBarItem alloc ]
        initWithTitle: @"My Info"
        image: [ UIImage imageNamed: @"my_info.png" ]
        tag: 3
    ];  

Это работает, но я хотел бы создать метод, который будет возвращать контроллер nav при отправке строки в виде сообщения, поэтому мне не нужно делать все это для каждого представления. Проблема, с которой я столкнулся, заключается в том, что в первой строке нужно выделить объект на основе имени класса, переданного ему в виде строки (т. Е. XViewController нужно взять из строки, переданной методу), но я не знаю, как это сделать. трактовать строку как имя класса. Я знаю, что это возможно, потому что UIApplicationMain () может использовать строку для вызова класса делегата приложения. Как я могу это сделать?

Извините, если что-то из этого не имеет смысла, я все еще на начальном этапе изучения нового языка!

Ответы [ 4 ]

19 голосов
/ 22 июня 2009

Помимо использования среды выполнения, вы можете сделать это, просто используя методы Cocoa-touch:

NSString* theClassName = /* assume this exists */
Class theClass = NSClassFromString(theClassName);
NSObject* myObject = [[theClass performSelector:@selector(alloc)] init];
// do something with the new object instance
1 голос
/ 23 июля 2009

Если у вас есть несколько таблиц TableViewCell, загруженных из NIB, код для загрузки отдельных NIB становится уродливым, если вы ничего не делаете с динамической загрузкой.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    // header
    if (indexPath.row == 0) {
        cellHeader *cell = (cellHeader *)[self loadCell:identHeader];
        return cell;

    // load more
    } else if (indexPath.row == lastRow) {
        loadMore *cell = (loadMore *)[self loadCell:identLoadMore];
        return cell;
    }

    // default
    cellDefault *cell = (cellDefault *)[self loadCell:identDefault];
    return cell;
}

- (id)loadCell:(NSString *)className {
    id cell = [tweetsView dequeueReusableCellWithIdentifier:className];

    if (cell == nil) {
        NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:className owner:nil options:nil];

        for (id currentObject in topLevelObjects) {
            if ([currentObject isKindOfClass:[UITableViewCell class]]) {
                cell = currentObject;
                break;
            }
        }
    }

    return cell;
}
0 голосов
/ 22 июня 2009

Если я правильно понимаю вашу проблему, вам не нужны динамические классы для этой работы. Почему бы не создать для каждого класса контроллера представления уникальный метод title и image, который просто возвращает уникальный заголовок и изображение для этого контроллера представления. Затем создайте суперкласс для классов контроллеров представления с помощью фиктивных методов title и image.

Ваш код выше будет выглядеть примерно так:

- (UINavigationController *)getNavController:(XGenericViewController *)viewController
{
        UINavigationController  *xNavController = [ [ UINavigationController alloc ]
            initWithRootViewController: viewController
        ];
        xNavController.tabBarItem = [ [ UITabBarItem alloc ]
            initWithTitle: [viewController title]
            image: [viewController image]
            tag: 3
        ];

    return [xNavController autorelease];
}
0 голосов
/ 22 июня 2009

Использование Objective-C 2.0 Runtime Reference

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