Welcome!
This is the community forum for my apps Pythonista and Editorial.
For individual support questions, you can also send an email. If you have a very short question or just want to say hello — I'm @olemoritz on Twitter.
Problems with ios15
-
@JonB don't forget that line tbl.delegate = MyTableViewDelegate() was initially in the delegate, it can't work.
-
I copied the above code and ran it as is. It did not return the selected author. What was printed in the console was:
after wait: None
list dialog returned: None
items: ['Baldacci,David', 'Barr,Nevada', 'Bartol,Amy', 'Bernt,Eric', 'Brandt,Kylie', 'Bruni,Riccardo', 'Bryndza,Robert', 'Burke,James Lee', 'Burton,Mary', 'Butcher,Jim', 'Carlson,Tucker', 'Carrol,Sean', 'Case,Andrew', 'Chernov,Ron', 'Clayton,MegWaite', 'Coben,Harlan', 'Cole,Bobby', 'Connelly,Michael', 'Cornwell,Bernard', 'Cornwell,Patricia', 'Cowie,Amber', 'Crombie,Deborah', 'Crosby,Ellen', 'Cross,Katie', 'Cussler,Clive', 'Delaney,Matthew B.J.', 'Dilts,Tyler', 'Dorsey,Tim'] section, row: 0 4
in delegate: my_sel Brandt,Kylie -
Ok, so the modal_wait is broken -- the after wait prints before anything else!
Possibly we need to add a time.sleep before the modaL wait to ensure the view is presented. Or we need some UI.in_background or on_main_view somewhere...
Have you tried the
dialogs
module? This is exactly it's purpose, and you don't seem to be doing anything that requires anything custom. -
This appears to be a problem only when running iOS 15 on an iPhone 12. The @JonB example runs fine on my iPad mini, but does not work on my iPhone 12 mini.
I have run into the same problem with some rubicon-objc code i developed.
# works on iPad, but fails on iPhone 12 mini while self.ispresented: waituntil = NSDate.alloc().initWithTimeIntervalSinceNow(.2) runLoop = NSRunLoop.currentRunLoop runLoop.runUntilDate(waituntil)
Here are some links to others with a similar problem.
https://stackoverflow.com/questions/69312354/failed-to-block-main-thread-with-runloop-on-ios15-with-device-iphone12
https://developer.apple.com/forums/thread/691941I have other Pythonista scripts that use modal_wait() that do seem to work, so maybe there is a work around
-
I wonder if this is a navigation view problem. Try presenting
view
without creating a nav view. -
@JonB Presenting the view directly without the nav view has the same issue on my iPhone 12. The first line in the console is after wait: None
-
A workaround might be to use a Lock.
def show_list_dialog(items=None, *args, **kwargs): items = items or [] tbl = ui.TableView(**kwargs) tbl.data_source = ui.ListDataSource(items) my_sel = {'value': None} import threading lock=threading.Lock() class MyTableViewDelegate (object): def tableview_did_select(self, tableview, section, row): print('items:', tableview.data_source.items) print('section, row:', section, row) my_sel['value'] = tableview.data_source.items[row] tableview.close() lock.release() print('in delegate: my_sel',my_sel['value']) tbl.delegate = MyTableViewDelegate() tbl.present(style='sheet') lock.acquire() #tbl.wait_modal() print('after wait: ', my_sel['value']) return my_sel['value']
See if that solves it
-
This code works on my iPhone 12.
I added @ui.in_background to def select_author(sender)
I will also test the Lock code.
import ui # def show_list_dialog(items=None, *args, **kwargs): items = items or [] tbl = ui.TableView(**kwargs) tbl.data_source = ui.ListDataSource(items) my_sel = {'value': None} class MyTableViewDelegate (object): def tableview_did_select(self, tableview, section, row): print('items:', tableview.data_source.items) print('section, row:', section, row) my_sel['value'] = tableview.data_source.items[row] tableview.close() print('in delegate: my_sel',my_sel['value']) tbl.delegate = MyTableViewDelegate() tbl.present(style='sheet') tbl.wait_modal() print('after wait: ', my_sel['value']) return my_sel['value'] # w, h = ui.get_screen_size() view = ui.View(name="Frank's Library", bg_color='lightblue', frame=(0, 0, w, h)) @ui.in_background def select_author(sender): author_unique = ['Baldacci,David', 'Barr,Nevada', 'Bartol,Amy', 'Bernt,Eric', 'Brandt,Kylie', 'Bruni,Riccardo', 'Bryndza,Robert', 'Burke,James Lee', 'Burton,Mary', 'Butcher,Jim', 'Carlson,Tucker', 'Carrol,Sean', 'Case,Andrew', 'Chernov,Ron', 'Clayton,MegWaite', 'Coben,Harlan', 'Cole,Bobby', 'Connelly,Michael', 'Cornwell,Bernard', 'Cornwell,Patricia', 'Cowie,Amber', 'Crombie,Deborah', 'Crosby,Ellen', 'Cross,Katie', 'Cussler,Clive', 'Delaney,Matthew B.J.', 'Dilts,Tyler', 'Dorsey,Tim'] f = (0, 0, 400, 300) selected_author = show_list_dialog(author_unique, frame=f, name='Select an Author') print('list dialog returned:', selected_author) global author_result author_result.text = str(selected_author) return author_button = ui.Button(title='Author', frame=(10,5,350,100), border_color='black', border_width=2, background_color='#EAECEE', action=select_author, font=('Arial Rounded MT Bold',18)) author_button.width=70 author_button.height=40 view.add_subview(author_button) # global author_result author_entry='' author_result = ui.TextView(name='author',frame=(100,5,250,40), border_color='black', border_width=3, text=author_entry, font=('Arial Rounded MT Bold',16)) view.add_subview(author_result) view.present('sheet') #nav_view = ui.NavigationView(view) #nav_view.present('sheet')
@
-
Ok, that makes sense. You can't have a wait_modal on the main thread, since you wouldn't be able to interact with the gui.
-
Thank you bosco. That fix works for me on iPhone12.
-
-
@frankL sorry to have searched in the bad direction...
-
This post is deleted! -
This post is deleted!