2009-10-28 25 views
7

Tôi đã ở khắp nơi, có vẻ như UITableView với vấn đề nền tĩnh được ghi lại đầy đủ, nhưng không ai có giải pháp thẳng về phía trước? Im xây dựng TableViews hoàn toàn bằng mã, như thế này của tôi:iPhone UITableView PlainStyle với hình nền tùy chỉnh - được thực hiện "hoàn toàn" trong mã

UIViewController *tableViewController = [[TableViewController alloc] init]; 
navigationController = [[UINavigationController alloc] 
         initWithRootViewController:tableViewController]; 
[tableViewController release]; 
[window addSubview:navigationController.view]; 

Cửa sổ là chính UIWindow build của tôi đối với tôi trong các đại biểu ứng dụng. Từ đây tôi cần phải xây dựng một vài khác nhau TableViews (được kiểm soát bởi navigationController), một số có fetchedResultsControllers, các ô tùy chỉnh, v.v. Tôi thích để làm điều này hoàn toàn trong mã, không sử dụng nib của điều này sẽ dẫn đến hoặc có tùy biến lây lan giữa mã và IB hoặc phải xây dựng và duy trì 6 + Nibs khác nhau.

Tôi chỉ đơn giản là không thể tìm thấy ví dụ hoạt động khi Lớp học tableViewController đặt hình nền của riêng nó. Nếu tôi làm điều này bên trong một trong tôi TableViews (mở rộng UITableViewController):

self.tableView.backgroundColor = backgroundColor; 

tôi, tất nhiên, nhận nền của tableView màu (mà tình cờ màu của cũng di động, suy nghĩ của tế bào được thừa hưởng màu sắc của họ từ tableView?) nhưng tôi muốn có một hình nền tĩnh mà các ô của tôi trượt lên và xuống trên đầu trang. Không phải là "hình nền" mà trượt lên xuống bằng cử chỉ của người dùng. Chính xác những gì TableViewStyle tableView cung cấp, nhưng trong một bảng PlainStyleView :) .. và được thực hiện bằng cách sử dụng mã, không phải IB.

Tôi đoán tôi phải xóa màu nền của chế độ xem bảng, sau đó đặt màu Ô khi định cấu hình để chúng không bị trong suốt. Và sau đó bằng cách nào đó "lén" một hình nền bên dưới khung nhìn tableView từ bên trong cá thể tableView?

Làm thế nào tôi sẽ đi về điều này, giải pháp tốt nhất sẽ có thể làm điều này trong viewDidLoad hoặc bất kỳ chức năng khác bên trong TableViewController của tôi, để giữ tất cả các tùy chỉnh của tôi ở một nơi.

Hy vọng ai đó có thể giúp tôi, Im tất cả 'googled out' :) Cảm ơn!

Trả lời

9

Bạn cần thiết lập bộ điều khiển dưới dạng UIViewController, không phải là UITableViewController. Sau đó, thêm tableview lập trình trên nền imageView.

@interface SomeController : UIViewController <UITableViewDataSource, UITableViewDelegate> { 
    ... 
    UITableView *tableView; 
    ... 
} 
@property (nonatomic, retain) UITableView *tableView; 
@end 



@implementation SomeController 

@synthesize tableView; 

... 

- (void)loadView { 
    [super loadView]; 
    UIImageView *v = [[[UIImageView alloc] initWithFrame:self.view.bounds] autorelease]; 
    [v setImage:[UIImage imageNamed:@"table_background.png"]]; 
    [self.view addSubview:v]; 


    self.tableView = [[[UITableView alloc] initWithFrame:self.view.bounds] autorelease]; 
    [self.tableView setBackgroundColor:[UIColor clearColor]]; 
    [self.view addSubview:self.tableView]; 
} 
... 
@end 
+0

Cảm ơn Coneybeare, điều này dường như tuân theo logic mà tôi đã thấy trong ngòi có kết hợp một hình ảnh tùy chỉnh, xây dựng quan điểm chung chung, chấm ImageView và một tableView bên trong nó. Tôi nhận được một số hành vi lạ:/ Tôi đã triển khai cellForRowAtIndexPath: và nó cũng có một biến cục bộ được gọi là "tableView". Điều này làm cho trình biên dịch cảnh báo "khai báo cục bộ của 'tableView' ẩn biến thể hiện". Sau đó tôi đã thử đổi tên biến thành tableViewLocal nhưng cảnh báo vẫn tồn tại. -continue ... – RickiG

+2

Ngoài ra khi tải chế độ xem (như được mô tả trong câu hỏi của tôi), nó bị treo khi tôi thêm [self.tableView addSubview: self.tableView]; Không phải là: [self.view addSubview: self.tableView]; điều này biên dịch và hoạt động, nhưng chỉ có hình nền, không có bảng? Tôi nghĩ rằng cách tiếp cận là âm thanh, nhưng có một cái gì đó Im mất :) Thans một lần nữa :) – RickiG

+0

Tôi sẽ thay đổi tất cả các đối số "tableView" trong các phương thức chữ ký là theViewView, và để self.tableView như nó được. Tai nạn là một lỗi đánh máy trên phần của tôi, nó phải có self.view thêm ... (cố định bây giờ) – coneybeare

0

Cảm ơn Coneybeare.

Nó không sụp đổ nữa và hình nền chỉ trở nên hoàn hảo (cùng với điều hướng của tôiTrình điều khiển ở trên cùng) Tuy nhiên, vẫn không nhìn thấy tableView?chỉ là hình nền và navigationControllerBar:

Đây là triển khai thực hiện của tôi:

- (void)loadView { 
[super loadView]; 

UIImageView *imageView = [[[UIImageView alloc] initWithFrame:self.view.bounds] autorelease]; 
[imageView setImage:[UIImage imageNamed:@"carbon_background.png"]]; 
[self.view addSubview:imageView]; 

[self.tableView = [[UIView alloc] initWithFrame:self.view.bounds] autorelease]; 

[self.tableView setBackgroundColor:[UIColor clearColor]]; 
[self.view addSubview:self.tableView]; 

}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)theTableView { 
return 1; 

}

- (NSInteger)tableView:(UITableView *)theTableView numberOfRowsInSection:(NSInteger)section { 
return 3; 

}

- (UITableViewCell *)tableView:(UITableView *)theTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

static NSString *CellIdentifier = @"Cell"; 

UITableViewCell *cell = [theTableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
if (cell == nil) { 
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease]; 
} 
cell.textLabel.text = @"Hello, World"; 

return cell; 

}

// cam kết chỉnh sửa, didSelectRow, bộ nhớ ... vv

Diễn đàn không cho toàn bộ một file .m trong một đi. Xin vui lòng cho tôi biết nếu tôi để lại một cái gì đó ra có thể giúp chỉ ra một lỗi.

Tôi nghĩ có lẽ đó là thứ tự của các lớp và cố gắng này mà không có bất kỳ may mắn:

[self.view sendSubviewToBack:imageView]; 

Hope tôi đã bỏ lỡ một cái gì đó rõ ràng.

Cảm ơn thời gian của bạn :)

+0

Chỉ cần có nó :) self.tableView = [[[UIView alloc] initWithFrame: self.view.bounds] autorelease]; cần phải là: self.tableView = [[[UITableView alloc] initWithFrame: self.view.bounds] autorelease]; Khác nó sẽ không "phù hợp" :) Cảm ơn bạn một lần nữa! – RickiG

2

Ok, bây giờ nó đang chạy :) tableView của tôi không được dân cư với các tế bào của tôi, vì vậy breakPointing qua điều tôi phát hiện ra rằng mặc dù tôi đã thực hiện các TableViewDataSource và TableViewDelegate, đây chỉ là trong giao diện chính, tôi cần thiết để thiết lập các đại biểu và nguồn dữ liệu của tableview để = tự. Đối với những người khác tìm kiếm một câu trả lời cho đây là phương pháp vì nó đã kết thúc với Coneybeares giúp đỡ:

- (void)loadView { 
[super loadView]; 

UIImageView *imageView = [[[UIImageView alloc] initWithFrame:self.view.bounds] autorelease]; 
[imageView setImage:[UIImage imageNamed:@"carbon_background.png"]]; 
[self.view addSubview:imageView]; 

[self.tableView = [[UITableView alloc] initWithFrame:self.view.bounds] autorelease]; 
[self.tableView setBackgroundColor:[UIColor clearColor]]; 
[self.view addSubview:self.tableView]; 

self.tableView.delegate = self; 
self.tableView.dataSource = self; 

}

0

Một số lời khuyên:

  • Nếu sử dụng một UISplitViewController:

    splitViewController.view.backgroundColor = [UIColor scrollViewTexturedBackgroundColor]; 
    
  • Nếu sử dụng UINavigationController:

    navigationController.view.backgroundColor = [UIColor scrollViewTexturedBackgroundColor]; 
    
  • Nếu sử dụng cả một UISplitViewControllerUINavigationController:

    navigationController.view.backgroundColor = [UIColor clearColor]; 
    splitViewController.view.backgroundColor = [UIColor scrollViewTexturedBackgroundColor]; 
    

Hãy chắc chắn để thiết lập màu nền của bất kỳ UIView bạn muốn xem qua đó là trên đỉnh của UINavigationController hoặc UISplitViewController đến [UIColor clearColor].

6

Tất cả điều này nhảy qua hoops là không cần thiết nếu bạn đang nhắm mục tiêu> iOS 3.2, nơi bạn có thể sử dụng thuộc tính backgroundView mới để đặt UIImageView trực tiếp, ví dụ::

// In your UITableViewController subclass 
- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    UIImageView *view = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"background.png"]]; 
    self.tableView.backgroundView = view; 
} 
Các vấn đề liên quan