iOS - Как передать информацию из VIEW в контроллер?

Я довольно новичок в программировании в целом и слежу за видео CS193p на iTunesU. В настоящее время я выполняю задание 3, и у меня возникают проблемы с получением небольшого количества информации из представления, отправленного в контроллер просмотра.

Я считаю, что правильно настроил всю делегацию, поэтому вопрос в том, как заставить мой View Controller видеть немного информации (такой как self.bounds.size.width), которая является свойством, имеющимся только в представлении. Будет ли это включать использование self.dataSource? И если да, то каким образом я мог бы передать эту информацию? Моя конечная цель - заставить View Controller выполнить некоторое преобразование свойств View и отправить его обратно в View. drawRect чтобы его можно было нарисовать.

Спасибо!!

** Отредактируйте, как требуется, я разместил части моего кода drawRect ниже

- (void)drawRect:(CGRect)rect
{
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGFloat scale = 32;

    CGPoint midPoint;
    midPoint.x = self.bounds.origin.x + self.bounds.size.width/2;
    midPoint.y = self.bounds.origin.y + self.bounds.size.height/2;

    // ---- finding the y starting point

    float totalXsInWidth;
    totalXsInWidth = self.bounds.size.width / scale;

    float leftMostX = totalXsInWidth / -2;
    float graphResultY = sin(leftMostX); // ** in theory, I want "leftMostX" to be modifed by the equation entered (in the CONTROLLER)
    NSLog(@"The leftMostX is %f", leftMostX);

    [self.dataSource passingVariable:leftMostX]; //** Here I pass the variable from drawRect to get modifyed in the CONTROLLER

    float graphResultY1;

    graphResultY1 = 5; //this is a test, I want to see if the controller actually effect a change
    graphResultY1 = [self.dataSource calcResult:self]; //this should now be a different number than 5 or 0 (the init value)

    NSLog(@"From graphingview, the result is %f", graphResultY1); //** unfortunately = 0... :(

2 ответа

Прочитав CS193p Assignment 3 ( для всех, кто интересуется, он доступен здесь в формате PDF), похоже, что вас просят создать протокол для вашего подкласса UIView и получить делегата этого протокола (управляющего представления представления). контроллер) предоставить данные, используемые для рисования.

Если вы правильно настроили свой протокол, drawRect Метод должен запрашивать данные у контроллера представления через метод протокола, что-то вроде:

DataObject *data = [self.delegate getData];
// It might be [self.dataSource getData]; in your case

Это следует назвать getData Метод делегата, который вы должны были записать в контроллер представления (для этого я создал сигнатуру метода, адаптируясь к той, которая используется вашим протоколом. Кроме того, этот код не учитывает соответствующее управление памятью, если требуется):

- (DataObject *)getData
{
    // Get data from the model, and return
    DataObject *dataObjectToReturn = [Model getRelevantData];

    return dataObjectToReturn;
}

Виды drawRect теперь должен иметь соответствующий экземпляр DataObject и может использовать эти данные, чтобы нарисовать то, что нужно нарисовать.


Ниже приведен мой оригинальный ответ, который не имеет отношения к конкретной проблеме, описанной выше, но показывает другой метод взаимодействия контроллера представления / представления. (Этот метод не применим к вышеуказанной проблеме, потому что данные, необходимые для рисования, не должны принадлежать самому представлению.)

Чтобы получить доступ к свойствам представления из контроллера этого представления, вы должны использовать self.view, Таким образом, чтобы получить ширину вида, как в вашем примере, вы должны использовать:

CGFloat viewWidth = self.view.bounds.size.width;

Вы также можете установить представление контроллера, хотя обратите внимание, что для вашего примера вы должны предоставить весь CGRect для фрейма, так как прямое управление шириной недопустимо:

// This gets a reference to the view's frame, then uses values from it to create a new
// CGRect that is 10.0 points wider, and sets the frame of the view to the new frame

CGRect viewFrame = self.view.frame;
self.view.frame = CGRectMake(viewFrame.origin.x, viewFrame.origin.y, viewFrame.size.width + 10.0f, viewFrame.size.height);

Я не ошибаюсь с назначением, но если вы используете представление в контроллере представления, вы можете получить доступ к свойству представлений следующим образом:

 SomeView *someView = [SomeView new];

 CGFloat width = someView.bounds.size.width;
Другие вопросы по тегам