Как создать родительский объект для подпредставления с несколькими UIImageViews в ViewController с помощью iOS5 - PullRequest
1 голос
/ 05 марта 2012

В приложении для iPhone для iOS5 я пытаюсь создать объект контроллера, который содержит вложенный вид изображения с несколькими UIImageViews.У меня есть контроллер основного представления со связанным с ним основным видом, и в этом основном представлении у меня есть вложенное представление с несколькими изображениями, и у этого вспомогательного представления есть дюжина или более UIImageViews, настроенных в Интерфейсном Разработчике.Я создал потомок UIView и подключил его как соединение IBOutlet для ImageSubView в моем ViewController.Я хочу создать IBOutlets для дюжины UIImageViews в моем классе subView, но Interface Builder позволит мне создавать IBOutlets только в моем главном ViewController, а не в классе ImageSubView.То есть, когда я управляю перетаскиванием из одного из UIImageViews, он показывает создание IBOutlet только в том случае, если я перетаскиваю в коде MainViewController @interface, но не в код ImageSubView @interface.Я хочу, чтобы детали управления этими дюжинами изображений были скрыты от основного ViewController.Я хочу, чтобы основной ViewController связывался только с ImageSubView, а ImageSubView знал, как управлять дюжиной изображений внутри него.Нужно ли создавать sub-viewController?Если так, то как мне создать sub-viewController в текущем главном представлении?Интерфейсный Разработчик не позволил бы мне перетащить другой ViewController в текущий основной вид.Может ли быть несколько viewControllers (основной и подконтроллеры) для одного экрана?

Иерархия представлений выглядит следующим образом:

MainViewController
    MainView
       ImageViewFullBackground
       ImageSubView
          UIImageView1
          UIImageView2
          . . . 
          UIImageView12
       Button1
       Button2
       . . .
       Button10

В ответ на Аллена мой заголовок ImageSubView,Класс на самом деле называется UILedNumericView

//
//  UINumericLabel.h
//  UILedNumericView
//
//  Created by Jon D. Newbill on 2/18/12.
//  Copyright (c) 2012 Bitworks Systems Inc. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface UILedNumericView : UIView

@property (copy,nonatomic) NSString * text;

// This is the numeric value of the LED display as a double
@property (nonatomic) double value;

// Returns true if the numeric display contains a decimal point
@property (readonly,nonatomic) BOOL hasDecimalPoint;

// Returns true if numeric display contains an exponent
@property (readonly,nonatomic) BOOL hasExponent;

// Returns true if numeric display is equal to zero.
@property (readonly,nonatomic) BOOL isZero;

// Returns number of characters in entire display
@property (readonly,nonatomic) NSUInteger length;

// Returns zero based character index of the E in the display
@property (readonly,nonatomic) NSUInteger exponentIndex;

// Returns or sets mantissa portion of display.  This is everything
// preceding the "E" on the display or the entire display if it does
// not contain an "E";
@property (copy, nonatomic) NSString * mantissa;

// Returns or sets exponent portion of display.  This is everything
// following the "E" on the display.  If no E exists then an empty
// string is returned.  When set to a non-zero length string an E will
// be added to the display.
@property (copy, nonatomic) NSString * exponent;

// Returns maximum allowed characters in display
// This includes digits, sign, decimal point and exponent
+ (NSUInteger) maxLength;

@end

Ответы [ 5 ]

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

Прежде всего, если вы хотите спрятать логику в объект, отличный от MainViewController, я предлагаю вам создать второй контроллер, например. ImageSubViewController. Вы можете определить его внешний вид с помощью специального файла NIB, в котором вы связываете все свои UIImageViews с родительским ImageSubViewController и его IBOutlets.

Тогда я предлагаю вам сделать это:

  1. Добавьте общий компонент UIView к представлению MainViewController и IBOutlet для его обработки (назовем его imageSubView)
  2. Добавить свойство к MainViewController для обработки экземпляра ImageSubViewController (назовем его imageSubViewController)
  3. Внутри MainViewController в методе viewDidLoad создайте экземпляр ImageSubViewController и добавьте его представление к ранее созданному заполнителю:

    [self.imageSubView addSubView:imageSubViewController.view];

Таким образом, у вас будет собственное подпредставление внутри MainViewController, и вы сможете управлять его поведением с помощью экземпляра ImageSubViewController, даже для каждой точки просмотра подизображения, например. через imageSubViewController.image1, imageSubViewController.image2 и т. д.

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

0 голосов
/ 29 марта 2012

Почему бы вам просто не спроектировать свой ImageSubView как отдельный UIView. Разместите это подпредставление внутри своего собственного файла .xib. Затем убедитесь, что ваш подкласс реализует initWithCoder:. Затем вы можете добавить подпредставление к вашему ImageViewController. Просто убедитесь, что для всех объектов в .xib определены их собственные классы.

Дайте мне знать, если некоторые изображения или пример проекта помогут вам немного лучше понять эту концепцию. Иногда работа, которую IB делает за сценой, может показаться магией, но как только вы поймете это, вы увидите великую силу, стоящую за ней.

0 голосов
/ 29 марта 2012
   int i,x,y;
   x=y=2;
    NSArray *viewsToRemove = [mainScroll subviews];
      for (UIView *v in viewsToRemove) [v removeFromSuperview];

      useD=[NSUserDefaults standardUserDefaults];
      imageArray=[useD objectForKey:LIVE];
      for( i=1;i<=[imageArray count] ;i++)
      {   
          iName=[imageArray objectAtIndex:i-1];
          UIImage *image = [UIImage imageNamed:iName];
          UIImageView *mainImageView=[[UIImageView alloc]initWithImage:image];
          [mainImageView setTag:i];
          [mainImageView setUserInteractionEnabled:YES];

          //for delete time tap and general tap gesture
          if(tapFlag)
          {
              tap=[[UITapGestureRecognizer alloc]initWithTarget:self       action:@selector(imageDisplay:)];
              [mainImageView addGestureRecognizer:tap];
          }
          else
          {
              UITapGestureRecognizer *tap2=[[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(selection:)];
              [mainImageView addGestureRecognizer:tap2];
          }

          //for Border and lastAccessed Diff. Border
          if(lastAccessed==i)
          {
              [mainImageView.layer setBorderColor:[UIColor blueColor].CGColor];
              [mainImageView.layer setBorderWidth:2];
          }
          else
          {
              [mainImageView.layer setBorderColor:[UIColor whiteColor].CGColor];
              [mainImageView.layer setBorderWidth:2]; 
          }
          //for rounded UIImageView
          CALayer * l = [mainImageView layer];
          [l setMasksToBounds:YES];
          [l setCornerRadius:10.0];


          CGRect frame = CGRectMake(x,y,WIDTH,HEIGHT);
          mainImageView.frame = frame;


          x+=WIDTH;
          if(i%orientation==0)
          {
              x=2;
              y=y+HEIGHT+5;
          }
          else
          {
              x=x+GAP;
          }
          [mainScroll addSubview:mainImageView];

      }
      [mainScroll setContentSize:CGSizeMake(0,(i-1)*add)];
  }
0 голосов
/ 29 марта 2012

Первый: объявить IBOutlets в заголовке ImageSubView (UILedNumericView.h, я полагаю).Один для каждого UIImageView Второй: перейдите в Интерфейсный Разработчик и обязательно установите класс для ImageSubView в UILedNumericView, так как это класс ImageSubView.Третье: управление перетаскиванием из каждого imageView # в ImageSubView слева от Interface Builder (схематическое представление с деревом представлений).Четвертое: появляется список IBOutlets, и вы выбираете правильный.Пятое: синтезируйте все IBOutlets и закодируйте некоторые методы для управления ими в UILedNumericView.m

Если я понял вашу проблему, это очевидное решение.

Пройти третий этап можно, выбрав ImageSubView и изправая панель, где у вас есть полный список выбранных выходов объектов, и вы можете перетащить их из imageViews.

0 голосов
/ 29 марта 2012

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

NSArray *subViewsArray = self.view.subviews; //Change this to the name of your view
UIView *view1 = [subViewsArray objectAtIndex:0]; //This selects view at position 0
NSLog(@"View1: %@",view1); //You can see what view you extracted (the properties)

Нет необходимости создавать контроллер вида или что-то в этом роде.Однако это возможно, если вы хотите, но я не верю, что это то, что вы хотите.

Edit : IBOutlets, поскольку их имя подразумевает, используются, чтобы сказать компилятору сделать указатель наэлемент в конструкторе интерфейсов, поэтому, если вы будете следовать тому, что я опубликовал, вы все равно будете создавать эти указатели программно.Если вы хотите использовать «глобальное» удобство, как в IBOutlets, просто создайте свойство для UIView, а не объявляйте их локально, как я.

Edit2 : Забыл упомянутьчто порядок представлений совпадает с порядком в конструкторе интерфейса сверху вниз.(если вы не изменили их программно)

...