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;