Помощь с приложением Wikibooks WikiDraw Obj-C - PullRequest
0 голосов
/ 19 февраля 2011

Я решил начать изучать Obj-C. И я подумал, что приложение Wikibooks wikidraw будет хорошим местом для запуска (после некоторых очень простых программ «Hello World»). Я следовал за главами, и теперь я нахожусь в конце "класса представления WikiDraws". Так что теперь я должен быть в состоянии скомпилировать и запустить. Конечно, это не работает. Сначала я получил много ошибок, но я исправил большинство из них, осталось только 6. Это один из них:

    - (void)                mouseDragged:(NSPoint) pt<br>
{
    NSPoint np;
    np.x = pt.x - _anchor.x;
    np.y = pt.y - _anchor.y;
    if ( _dragState == 0) {
        // dragging of object
        [self offsetLocationByX:np.x byY:np.y];
        }
     else if ( _dragState >= 1 && _dragState < 9 )
    {
        // dragging a handle
        NSRect nb = [self newBoundsFromBounds:[self bounds] forHandle:_dragState withDelta:np];<br>
        [self setBounds:nb];
        }
    }</p>

<code>- (NSRect) newBoundsFromBounds:(NSRect) old forHandle:(int) whichOne withDelta:(NSPoint) p
{
    // figure out the desired bounds from the old one, the handle being dragged and the new point.
NSRect nb = old;

switch( whichOne )
{ ..........
</code>

</p> <p>So at NSRect nb = [self newBoundsFromBounds:... Я получаю сообщение об ошибке «Invailid initializer» и «WKDShape может не отвечать на '-newBoundsFromBounds: forHandle: withDelta:" -. Что я должен делать? Я новичок в программировании, но хочу учиться.

/ Карл-Филипп

Ответы [ 2 ]

0 голосов
/ 19 февраля 2011

Чтобы устранить предупреждение «WKDShape может не отвечать», обязательно укажите -newBoundsFromBounds:forHandle:withDelta: до -mouseDragged:. Вы можете добавить его в общедоступный интерфейс в "WKDShape.h" или в анонимной категории в "WKDShape.m".

0 голосов
/ 19 февраля 2011

Если вы вставили этот код в порядке, указанном в исходном коде, и newBoundsFromBounds: forHandle: withDelta: не объявлен (в отличие от определения) в какой-то более ранний момент, я думаю, что проблема заключается в том, что при nb= [self newBoundsFromBounds: ... компилятор еще не знает, какой будет тип возвращаемого значения.NSRect - это структура в стиле C, а не класс Objective-C, поэтому компилятору действительно нужно знать.

В качестве решения либо поместите определение newBoundsFromBounds: ... before mouseDragged :, addэто к @interface в вашем заголовочном файле, если вы хотите, чтобы он был открыт для всех или объявлен внутри файла реализации как метод категории.Чтобы сделать последний, добавьте следующее в начало вашего .m, предполагая, что ваш класс называется WikiDrawsView:

@interface WikiDrawsView (private)
- (NSRect)newBoundsFromBounds:(NSRect) old 
                    forHandle:(int) whichOne
                    withDelta:(NSPoint) p;
@end

«private» - это просто имя, которое вы выбираете, оно не имеет специальногоимея в виду.Нечто вроде «private» часто используется для обозначения того, что вы используете категорию аналогичным образом, что вы можете использовать функции-члены частного класса в C ++ или в таком языке.

Быстрый способ описания категорийчтобы они добавляли дополнительные методы к существующим классам во время выполнения и использовали синтаксис @interface [classname] ([category name]) без секции переменных-членов.Я уверен, что ваш учебник дойдет до них, документация Apple на них здесь .Это обычное использование категорий, но не основное использование.

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