Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is it possible to disable didSelectRowAtIndexPath in a part of row in UITableView?

I have a UITablaView in my Objective C application. I have the custom cells with a label and a UIImageView. I want to disable a part of the rows, to disable didSelectRowAtIndexPath when users click on this row's part.

I want this:

enter image description here

Is it possible?

like image 627
user3745888 Avatar asked Dec 14 '16 08:12

user3745888


2 Answers

Here is the simple and the most elegant solution that I can think off.

I believe you must be having a CustomCell, which holds the IBOutlet to imageView on the left side :) You can make use of hitTest method to solve your problem :)

In your CustomCell lets assume it to be MyTestCell class write this,

override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
        if self.myImageView.frame.contains(point) {
            return nil
        }
        return super.hitTest(point, with: event)
    }

Where myImageView is the IBOulet of imageView on the left hand side of your cell :)

All am doing is checking where did user tap, if the touch point is within the frame of cells imageView you return nil as the view. When you return nil touch event stops propagating to its parent views and finally will never reach cell hence didSelectRowAtIndexPath never called,

On the other hand you should handover touch to the next view and you do it simply by calling same method on its super iOS will eventually trace it back to cell and triggers didSelectRowAtIndexPath

Hope it helps :)

like image 184
Sandeep Bhandari Avatar answered Oct 16 '22 15:10

Sandeep Bhandari


You can do a simple trick (without the need of writing code) to solve this issue, by adding a button that covers the part that you want to disable the selection of it. Obviously, the button should not have any text or background color (it should be clear color), also make sure to add suitable constraints for making sure that is covered the wanted part of the cell.

So when tapping on the button, nothing should happen and didselectRow should not get called because the actual touching event should be referred to the button, not to the row.

Hope this helped.

like image 20
Ahmad F Avatar answered Oct 16 '22 15:10

Ahmad F