Персонализиране на UITableView с лента за търсене

Имам TableView с лента за търсене. Но искам да добавя друг изглед (да кажем етикет) към TableView (така че да се превърта с tableview). Например, ако отворите приложението Телефонни контакти на iPhone, под Всички номера можете да видите етикет, наречен „Моят номер:“. Което трябва да е на същото йерархично ниво като лентата за търсене. Опитах се да добавя нов етикет точно над лентата за търсене, но разкадровките не ми позволяват да направя това.

Екранна снимка на контура на документа за ViewController

Тук, ако плъзгам и пускам UILabel към тази йерархия, той или замества лентата за търсене в горната част, или етикетът пада вътре в прототипната клетка. Няма друг начин за показване на лентата за търсене и етикета едновременно.

Има ли някакъв начин това да стане?


person Rukshan Marapana    schedule 09.11.2012    source източник


Отговори (2)


Създайте отделен изглед извън изгледа на контролера на изгледа (или вътре, няма значение. можете дори да създадете това програмно) и го свържете към IBOutlet myCustomView. Създайте IBOutlet searchBar и свържете своя UISearchBar

in viewDidLoad; можете да използвате [searchBar addSubView:myCustomView]; и добавете своя персонализиран изглед над лентата за търсене.

можете да покажете/скриете (myCustomView.hidden = YES / NO) персонализирания изглед или да го добавите и премахнете от суперизглед, когато имате нужда.

ex.

- (IBAction)didTapShowCustomHeaderButton {
    myCustomView.hidden = NO;
}

- (IBAction)didTapHideCustomHeaderButton {
    myCustomView.hidden = YES;
}
person flopr    schedule 19.11.2012

добавете долупосочените два делегата в кода

 - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section 
    {

     UILabel *label = [[[UILabel alloc] initWithFrame:CGRectMake(10, 10, 100, 30)] autorelease];
      label.text = @"My Label";
    label.backgroundColor = [UIColor clearColor];

      return label;   

     }   

-(CGFloat)tableView:(UITableView*)tableView heightForHeaderInSection:(NSInteger)section{
        return 30 // this height should be equivalent to the myLabel height u declared in headerView above
        }
person AppleDelegate    schedule 09.11.2012
comment
Здравейте, благодаря за отговора. Но имам нужда този етикет да изчезне от екрана с лентата за търсене при превъртане на таблицата надолу. - person Rukshan Marapana; 09.11.2012
comment

Не можете да използвате Foo[Bleh] като Foo[Blah], тъй като Foo[Bleh] не е Foo[Blah]. Трябва да направите Foo контравариант на A, за да използвате Foo[Bleh] като Foo[Blah].

trait Foo[-A] {
  def bar(a: A) = println(a) // to make Foo contravariant 
}

Това работи добре:

scala> foo1(Blah())
res0: Blah = Blah()

Вашият оригинален код съдържа отговор на вашия въпрос. Да приемем, че можете да използвате оригиналния си Foo[Bleh] като Foo[Blah]:

def foo1[A:Foo](): A = implicitly[Foo[A]].bar

val b: Blah = foo1[Blah]()

В случай, че тук се използва Foo[Bleh], ще получите Bleh като резултат от bar, но очаквате Blah и Bleh не е Blah.

За щастие компилаторът няма да ви позволи да използвате оригиналния си Foo[Bleh] като Foo[Blah]:

scala> trait Foo[-A] {
     |   def bar: A
     | }
<console>:8: error: contravariant type A occurs in covariant position in type => A of method bar
         def bar: A
             ^

Извод за тип

Това работи добре:

foo1[Bleh](Blah())

Но компилаторът няма да изведе тип параметър A тук като Bleh. За да разберем "защо", трябва да знаем какво означава A:Foo:

def foo1[A:Foo](a:A) = a // syntax sugar
def foo1[A](a:A)(implicit ev: Foo[A]) = a // same method

A:Foo е синтактична захар за добавяне на неявен параметър.

Ако имате 2 групи параметри, компилаторът ще изведе типа в първата група и след това ще приеме, че типовете са известни. Така че след извеждане на типа на първата група параметри (a:A) типът Blah е известен и втората група параметри не може да повлияе на параметъра на типа.

- person AppleDelegate; 09.11.2012
comment
Трябва да скрия лентата за търсене по време на изпълнение и да покажа друг UI контрол, когато лентата за търсене е скрита. За да направя това, мисля, че трябва да добавя този друг UIcontrol на мястото, където лентата за търсене е точно позиционирана (йерархично) - person Rukshan Marapana; 09.11.2012