Трудно добавить UIView с UIViewController в качестве подпредставления - PullRequest
0 голосов
/ 06 декабря 2011

Я в основном хочу использовать PlacardView.m и PlacardView.h из примера Apple MoveMe, добавив его в качестве подпредставления на моем основном BlowViewController

PlacardView.m

#import "PlacardView.h"

@implementation PlacardView

@synthesize placardImage;



- (id)init {
    // Retrieve the image for the view and determine its size
    UIImage *image = [UIImage imageNamed:@"Placard.png"];
    CGRect frame = CGRectMake(0, 0, image.size.width, image.size.height);

    // Set self's frame to encompass the image
    self = [self initWithFrame:frame];
    if (self) {
        self.opaque = NO;
        placardImage = image;
        }
    return self;
}


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





@end

PlacardView.h

@interface PlacardView : UIView {
    UIImage *placardImage;

}

@property (nonatomic, retain) UIImage *placardImage;

// Initializer for this object
- (id)init;

@end

Это мой MicBlowViewController.h

#import <UIKit/UIKit.h>
#import <AVFoundation/AVFoundation.h>
#import <CoreAudio/CoreAudioTypes.h>

@class PlacardView;

@interface MicBlowViewController : UIViewController {
    AVAudioRecorder *recorder;
    NSTimer *levelTimer;
    double lowPassResults;

    PlacardView *placardView;
}


@property(nonatomic, retain) PlacardView *placardView;
- (void)setUpPlacardView;
- (void)levelTimerCallback:(NSTimer *)timer;

@end

Это частичный MicBlowViewController.m .. есть функция viewDidLoad, но она не имеет ничего общего с представлениями.. это просто таймер для записи звука, поэтому я не вставляю, что

#import "MicBlowViewController.h"
#import "PlacardView.h"

@implementation MicBlowViewController

    - (id)initWithFrame:(CGRect)frame {

        self = [super initWithFrame:frame];
        if (self) {
            [self setUpPlacardView];
        }
        return self;
    }


    - (void)setUpPlacardView {
        // Create the placard view -- its init method calculates its frame based on its image
        PlacardView *aPlacardView = [[PlacardView alloc] init];
        self.placardView = aPlacardView;
        [aPlacardView release];
        placardView.center = self.center;
        [self addSubview:placardView];
    }

Я получаю ошибку "Свойство 'center" не найдено для объекта типа "MicBlowViewController *" "

Пожалуйста помоги.

Ответы [ 3 ]

2 голосов
/ 06 декабря 2011

Аюш, твой код оставляет меня несколько озадаченным.

Код для вашего контроллера, кажется, имеет несколько проблем.

У UIViewController нет метода initWithFrame, а есть стандартный init или initWithNibName:bundle: метод при использовании файла Interface Builder.

Я вижу, что вы скопировали и вставили код из примера Apple MoveMe, однако имейте в виду, что MoveMeView, из которого вы скопировали код в контроллер, на самом деле является UIView , а не UIViewController .

Попробуйте это:

#import "MicBlowViewController.h"
#import "PlacardView.h"

@implementation MicBlowViewController

    - (void)viewDidLoad {

        [self setUpPlacardView];

        // Additonal code with your timer etc
    }


    - (void)setUpPlacardView {
        // Create the placard view -- its init method calculates its frame based on its image
        PlacardView *aPlacardView = [[PlacardView alloc] init];
        self.placardView = aPlacardView;
        [aPlacardView release];
        [self.view addSubview:placardView];
        self.placardView.center = self.view.center;
    }

Возможно, вам также потребуется реализовать метод loadView вашего MicBlowViewController.

Вы можете проверить Просмотреть руководство по программированию , а также Справочник по классам UIViewController .

2 голосов
/ 06 декабря 2011

Измените эту строку:

placardView.center = self.center; 

на эту:

placardView.center = self.view.center; 

self - это UIViewController, но вы хотите центр его обзора.

1 голос
/ 05 января 2012

Были те же проблемы. Почти весь пример кода использует контроллеры представлений и представления, которые были созданы отдельно (я полагаю, что Xcode работал так же). Xcode теперь создает ViewController вместе с представлением как свойством (представление, которое вы видите в GUI). Кикер в том, что вы не можете получить доступ к коду для этого представления (на самом деле ... Я спросил и получил указание прочитать руководство). Итак, как вы можете получить пример кода (который находится в представлении) в этом представлении, когда вы не можете видеть его код?

Два способа, которые я нашел:

  1. Создание нового представления, аналогичного коду в примерах представления. Затем нажмите на раскадровку, в графическом интерфейсе вы смотрите на представление ViewController по умолчанию. На правой панели щелкните инспектор идентификации (третья слева от бессмысленной фигуры). Вы увидите класс: UIView. Замените слово UIView именем созданного вами представления. ViewController теперь загрузит ваш вид. Другой недостаток заключается в том, что при создании представления он получает метод initWithFrame, который говорит, что запускает код инициализации. Это не. Вам нужно создать initWithCoder (google this) и указать здесь свой код инициализации.

  2. Другой вариант (возможно, правильный путь) заключается в использовании кода ViewController для добавления вашего представления (с примером кода) в качестве подпредставления представления по умолчанию, например, в ViewController.m

    Bus *newBus = [[Bus alloc] init];

    [self.view addSubview:newBus];

    т.е. self - это ViewController, а view - это его представление по умолчанию, т.е. свойство ViewController

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