Как поменять UIScrollViews? - PullRequest
0 голосов
/ 01 февраля 2012

Давайте представим, что у меня есть 2 UIScrollViews с разными UIImageViews внутри.Когда я запускаю действие, я бы хотел, чтобы содержимое, параметры и т. Д. (Кроме местоположения) второго UIScrollView были переданы в первый UIScrollView.

Итак, вот код, который я придумал:

-(void) someAction {
UIScrollView * scroll = [[UIScrollView alloc] init]; // create an intermediary scrollView
scroll = secondScroll; // here I intent to pass the content of secondScroll to scroll
scroll.frame = firstScroll.frame; // here I assign the frame of firstScroll to scroll
so that it doesn't take the frame of secondScroll;
firstScroll =scroll;  // and then pass all the contents of scroll to firstScroll;     
}

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

Любая помощь?

Спасибо

Ответы [ 4 ]

0 голосов
/ 02 февраля 2012

Если вы хотите клонировать элемент пользовательского интерфейса, вы используете NSCoder (как это делает загрузчик файлов nib).

NSData *scrollViewData = [NSKeyedArchiver archivedDataWithRootObject:self.firstScroll];
CGRect oldFrame = self.secondScroll.frame;
self.secondScroll = [NSKeyedUnarchiver unarchiveObjectWithData:scrollViewData];
self.secondScroll.frame = oldFrame;

Это сериализует UIView и все его подпредставления в NSData, а затем создает полную копию тех из NSData.

0 голосов
/ 02 февраля 2012

Попробуйте сделать следующее:

- (void)someAction {
    [firstScroll removeFromSuperview]; // So that we do not leave the old firstScroll as a subview
    firstScroll = [secondScroll copy]; // Makes a copy of secondScroll and stores it in firstScroll
    [self addSubview:firstScroll]; // Add the new firstScroll to the view
}

Важное замечание (я):
Этот код будет утечка памяти, так как -copy возвращаетобъект с количеством ссылок +1, но мы не выпускаем firstScrollвысоко предлагаю вам сделать свойства firstScroll и secondScroll nonatomic, retain (@property (nonatomic, retain) UIScrollView *firstScroll).Если вы хотите больше информации об этом, просто спросите.Кроме того, вам нужно убедиться, что firstScroll и secondScroll никогда не являются значениями мусора, когда этот код запускается (он будет аварийно завершать работу) - в зависимости от того, когда и как он вызывается, у вас может быть все в порядке.

0 голосов
/ 02 февраля 2012

@ jrtc27 Спасибо за ваш ответ. Я думаю, что нашел решение, и оно, кажется, выполняет то, что я ищу. Но я не уверен, правильно ли это или нет. Вот что я делаю:

- (void)someAction {
    [[firstScroll subviews] makeObjectsPerformSelector:@selector(removeFromSuperView:);//here I sort of blank out the content of the firstScroll
    NSArray * array = [secondScroll subviews];//place all subview of the secondScroll in array
    int i = 0;
    int nrOfSubviews = [array count];
    for (i=0;i<nrOfSubviews;i++) { //appoint them one by one to firstScroll
        [firstScroll addSubview:[array objectAtIndex:i]];
    }
}
0 голосов
/ 01 февраля 2012
-(void) someAction {
    UIScrollView * scroll = [[UIScrollView alloc] init]; // create an intermediary scrollView

Это НЕПРАВИЛЬНО. Это приведет к потере памяти, поскольку вы теряете указатель на это представление прокрутки после назначения его другому объекту. Вам лучше просто объявить UIScrollView * scroll; для этой цели.

    scroll = secondScroll; // here I intent to pass the content of secondScroll to scroll

Но это не то, что происходит. Представления прокрутки волшебным образом не копируют себя; если вы назначаете один другому, вы назначаете только указатель.

    scroll.frame = firstScroll.frame; // here I assign the frame of firstScroll to scroll
    // so that it doesn't take the frame of secondScroll;

Таким образом, с этого момента, если вы работаете на scroll, это повлияет на secondScroll.

    firstScroll = scroll;  // and then pass all the contents of scroll to firstScroll;     

И с этим вы назначаете firstScroll SecondScroll. Таким образом, firstScroll теперь по существу будет secondScroll, теряя его (теряя память снова и снова) и не делая ничего полезного.

}

Что на Земле вы пытаетесь сделать с этим?

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

BOOL firstScrollVisible = NO; // in -init or whatever

- (void) someAction
{
    if (fistScrollVisible)
        [self.view bringSubviewToFront:secondScroll];
    else
        [self.view bringSubviewToFront:firstScroll];
    firstScrollVisible = !firstScrollVisible;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...