2014-06-10 24 views
16

Tôi có quan điểm điều khiển với UITableView. Chiều cao của chế độ xem bảng là tĩnh và chiều cao == của màn hình. Số hàng trong bảng có thể thay đổi và đôi khi có thể là một tình huống khi số hàng nhỏ hơn số hàng có thể hiển thị, do đó xuất hiện một số khu vực rõ ràng ở cuối bảng. Tôi có thể phát hiện chạm vào nó mà không nhận dạng cử chỉ không? Có một số phương pháp đại biểu của UITableView?Làm thế nào để phát hiện vòi trên một phần rõ ràng của UITableView?

+0

Để didSelectRowAtIndexPath sử dụng lựa chọn hoặc bạn cũng có thể sử dụng tapgesture. –

+0

@VictorIppolitov gì về việc tạo ra một lớp tiểu UITableView, chuyển nhượng đó để xem bảng của bạn, và touchesBegan trọng vào các lớp tiểu mới? –

Trả lời

37

Vâng, có những phương pháp đại biểu, chẳng hạn như:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 

Tuy nhiên, điều này chỉ sẽ cho bạn biết nếu một vòi nước xảy ra trên một hàng hiện có. Nếu bạn muốn chụp các vòi trên không gian trống bên dưới các hàng (hoặc trên tiêu đề phần), bạn sẽ cần phải sử dụng trình nhận dạng cử chỉ. Bạn có thể làm một cái gì đó như thế này:

// in viewDidLoad or somewhere similar 
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tableTapped:)]; 
[self.tableView addGestureRecognizer:tap]; 
//......... 

- (void)tableTapped:(UITapGestureRecognizer *)tap 
{ 
    CGPoint location = [tap locationInView:self.tableView]; 
    NSIndexPath *path = [self.tableView indexPathForRowAtPoint:location]; 

    if(path) 
    { 
     // tap was on existing row, so pass it to the delegate method 
     [self tableView:self.tableView didSelectRowAtIndexPath:path]; 
    } 
    else 
    { 
     // handle tap on empty space below existing rows however you want 
    } 
} 

EDIT: cho một cách tiếp cận khác, hãy xem xét Connor Neville's approach từ câu trả lời của mình về bài đăng này và thêm các nhận dạng cử chỉ để nền của bảng.

+0

Bạn đang muốn lấy một cử chỉ trên một khu vực không tự động lấy cử chỉ qua đại biểu, vì vậy AFAIK không có cách nào dễ dàng xung quanh trình nhận dạng cử chỉ. – Stonz2

+0

Bây giờ một không thể xử lý sự kiện "tableTapped". Tôi đã thêm UIGestureRecognizerDelegate nhưng nó không hoạt động. –

+0

@VictorIppolitov bạn có thể cần phải thay đổi tên biến từ 'self.tableView' những gì Thiên dụ/lớp tên biến là cho bảng của bạn. – Stonz2

-4

Bạn không cần phải cử chỉ recogniser. Bạn nên impliment <UITableViewDelegate> trong ViewController.h của bạn và sau đó thêm phương pháp này để ViewController.m của bạn:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 

nơi indexPath là chỉ số nhấp dòng/cột.

+1

Điều này sẽ không cung cấp bất kỳ thông tin nào về các vòi trên 'tableView' nằm trong khoảng trống bên dưới các hàng hiện có, đó là những gì người hỏi đang hỏi. – Stonz2

14

Nhờ @ Stonz2, phiên bản nhanh chóng:

Swift 4

let tap = UITapGestureRecognizer(target: self, action: #selector(tableTapped)) 
self.tableView.addGestureRecognizer(tap) 

@objc func tableTapped(tap:UITapGestureRecognizer) { 
    let location = tap.location(in: self.tableView) 
    let path = self.tableView.indexPathForRow(at: location) 
    if let indexPathForRow = path { 
     self.tableView(self.tableView, didSelectRowAt: indexPathForRow) 
    } else { 
     // handle tap on empty space below existing rows however you want 
    } 
} 

Swift 3

let tap = UITapGestureRecognizer(target: self, action: #selector(tableTapped)) 
self.tableView.addGestureRecognizer(tap) 

func tableTapped(tap:UITapGestureRecognizer) { 
    let location = tap.location(in: self.tableView) 
    let path = self.tableView.indexPathForRow(at: location) 
    if let indexPathForRow = path { 
     self.tableView(self.tableView, didSelectRowAt: indexPathForRow) 
    } else { 
     // handle tap on empty space below existing rows however you want 
    } 
} 

Swift 2:

let tap = UITapGestureRecognizer(target: self, action: #selector(tableTapped)) 
self.tableView.addGestureRecognizer(tap) 


func tableTapped(tap:UITapGestureRecognizer) { 
    let location = tap.locationInView(self.tableView) 
    let path = self.tableView.indexPathForRowAtPoint(location) 
    if let indexPathForRow = path { 
     self.tableView(self.tableView, didSelectRowAtIndexPath: indexPathForRow) 
    } else { 
     // handle tap on empty space below existing rows however you want 
    } 
} 
22

Tất cả các câu trả lời được cung cấp, bao gồm câu trả lời được chấp nhận, thêm UITapGestureRecognizer vào tableView; trong khi điều này sẽ làm việc, tôi đã phát hiện ra rằng cử chỉ nhận dạng này có thể cản trở vòi hàng và kích hoạt didSelectRowAtIndexPath theo một cách hơi khó lường/không xác định.

Nếu bạn muốn phát hiện vòi trong "không gian trống" cũng như trong hàng, tôi đánh giá cao đề nghị thêm một cái nhìn nền để bàn của bạn, và thêm các nhận dạng cử chỉ đó:

let tap = UITapGestureRecognizer(target: self, action: #selector(tableTapped)) 
self.tableView.backgroundView = UIView() 
self.tableView.backgroundView?.addGestureRecognizer(tap) 
+5

** Đây là câu trả lời hay nhất **: nó cũng giữ nguyên phần trả lời lựa chọn 'tableView' để bạn có thể thấy lựa chọn các hàng của mình. –

+0

Cảm ơn bạn đã chia sẻ. –

Các vấn đề liên quan