How to handle multi-touch in UITableViewCell with buttons? - ios

I have custom table view cells that each have 3 buttons. Selecting a row in the table pushes another view controller; pressing one of the buttons shows a modal view.
If, with two fingers, I select a row, and press a button, both the controller gets pushed and the modal view appears . I've tried setting a flag in the buttons' TouchDown event and returning nil in
tableView: willSelectRowAtIndexPath:
if the flag is true, but the flags gets set to false in the buttons' TouchUpInside event handler, so the tableview: didSelectRowAtIndexPath: still gets called.
How can I solve this issue ?

In your button's touch down method, set the UITableView's allowsSelection property to NO. Then in the touch up (both inside and outside) handler set it back to YES.

It helps
cell.contentView.exclusiveTouch = YES;
cell.exclusiveTouch = YES;
setting exclusiveTouch to custom UITableViewCell

Related

UITableViewCell and UITextField with user interaction disabled doesn't call didSelectRow

My cell has a UITextField (bound to all the edges) with isUserInteractionEnabled on false. So I expect that when I click the cell the didSelectRowAt is called.
Nowm this never happens. It doesn't call the didSelectRowAt function.
Is there any way to find out who is consuming my event? Also in the view debugger, I don't see any views on top of it.
Make sure you implemented UITableViewDelegate.
Make sure you have not added UITapGestureRecognizer anywhere in your
view.
Make sure your VC is delegate of UITableView
Make sure your tableView selection is not "No Selection"
And final, try to use
textfield.isEnable = false
instead of
textfield.isUserInteractionEnable = false

UITableView cancels UITapGesture

uitableviewdidselect cancel outs tap gesture action
there is an UIImageView in cell.contentView and there is a tap gesture to enlarge the image the control is not going to the Tap Gesture action its passing to the tableview didselect delegate ? I am using UITableView class for my table already did userInteractionEnabled=YES & cancelsTouchesInView = NO
Make sure you set
tapGestureRecognizer.cancelsTouchesInView = NO;
It won't work because table view can't take two user interactions at a time. First it will give priority to didSelectRowAtIndexPath. You need to disable user interaction on cells. So that tap gesture will be called. Make sure that user interaction enabled for imageView.

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:
Is it possible?
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 :)
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.
This is very simple trick,
Add a button on profile image part, means on red part as shown in picture (provided by you). And don't do on click on button click.
Happy Coding!!!!
Simply put the button over Green area and set tag for each button. Onclick you can perform your functionality using tag. Like this
inside
func tableView(tableView: UITableView,cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell{
let obj: AnyObject = self.dataList.objectAtIndex(indexPath.row);
cell?.populateCellWithData(obj, indexPath: indexPath)
cell?.destinationLabel.userInteractionEnabled = true
let destRecognizer : UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "DestLabelTapped:")
destRecognizer.numberOfTapsRequired = 1
destRecognizer.delegate = self
cell?.destinationLabel.addGestureRecognizer(destRecognizer)
}
and in DestLabelTapped you can peform your functionlity
Another way
Just set two Tableview and scroll them side by side and one table is selectable and another is not. (don't do this)
In my understanding the tricks with buttons and other UIElements that are covering the content are not the right way to solve the target. As you will need extra manipulations with them in Storyboard, if you will need to make dynamically content, if you will work with constraints and many more situations where you will need to control your content and + the artificial cover. There are few things to do:
Set UITableView selection to No Selection
Put the second part that you want to be active in UIView. This UIView will be the content container.
Add UITapGestureRecognizer to UIView
UITapGestureRecognizer * tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:#selector(selectCellAction:)];
Add IBAction where you could do all you need.
- (IBAction)selectCellAction:(id)sender
{
// do what you need
}
And thats all.
You may simply do change the image view width constraints to 0. Where you want to action is performed. As for example:
1) If you use a button that cover the image.
2) If you take a navigation bar then you there take a button and perform the action.
hope this will help.

Keep button pressed down through view controller switch

I am currently creating a view which should appear when a user presses a button, and disappear as soon as they release a different button in the same place as the previous one. The only problem is that when the new view appears - when the view controller is switched - the new button appears deselected, despite it being set to selected and/or highlighted in its class's viewDidLoad method.
Code
override func viewDidLoad{
seeBillButton.selected = true
seeBillButton.highlighted = true
}
Thanks in advance!

Flicker when tapping on - button when table view is in edit mode

I am using a custom class which is subclassing UITableViewCell. Now, when tableview goes in edit mode, I adjust the UIComponents on the cell inside layoutSubviews of my custom class. Now, when user tap on the "-" button the layoutSubviews get called once again and the UIComponents on the cell again repositions themselves which causes a weird UI flicker. I tried with below code in layoutSubviews but then UIComponents on the cell does not reposition themselves when user tap on edit and table comes in edit mode. Is there any graceful way to handle this.
if (self.editingStyle == UITableViewCellEditingStyleDelete) {
return;
}
Ok. Found this property which is set when user tap on the - button to show the delete button:
self.showingDeleteConfirmation

Resources