[Interest] Qt/iOS subclassing and/or delegating

Ben Lau xbenlau at gmail.com
Fri May 29 16:08:52 CEST 2015


Depend on what kind of function you should to override. Just checked the
source code of QIOSViewController , shouldAutorotate is seem to be OK.
Moreover, Harri Pasanen has suggested  swizzling, which could replace a
method and call the original one by the wrapper.

On 29 May 2015 at 21:43, maitai <maitai at virtual-winds.org> wrote:

>  I think you can do that because openUrl is the only method implemented
> in the original QIOApplicationDelegate. So in fact you added
> didFinishLaunchingWithOptions and replaced openUrl. But if there were other
> methods (and QIOViewController has many), you would have been obliged to
> duplicate them all, at least that's what I understand.  Am I wrong?
>
>
>
>
> Le 29-05-2015 15:33, Ben Lau a écrit :
>
>
> You may override existing method just like what I did to openUrl and didFinishLaunchingWithOptions
> on QIOSApplicationDelegate even you don't have the header file.
>
>
>
>
> On 29 May 2015 at 21:25, maitai <maitai at virtual-winds.org> wrote:
>
>>  I tried but didn't succeed. If I understand well (which is far from
>> being certain), I can only add new methods or properties that way, not
>> override existing ones unless a protocol is defined that would allow me to
>> create a delegate on QIOViewController, but there is no as far as I can see.
>>
>> I might be wrong, though. I even hope so.
>>
>>
>>
>>
>> Le 29-05-2015 15:18, Ben Lau a écrit :
>>
>>
>> Why don't use categories that suggested by people here?
>>
>>
>> On 29 May 2015 at 21:11, maitai <maitai at virtual-winds.org> wrote:
>>
>>> Finally got it working... with a bad hack
>>>
>>> I cloned QIOSViewController.h and .mm from qt sources (and added qt's
>>> iOS headers in my include path, I already had core-private and
>>> gui-private in my pro files) and modified it to do what I want. I also
>>> had to add a lockedOrientation property to it for some mysterious
>>> reason...
>>>
>>> At least it's doing what I need (i.e. ignore device rotation when I
>>> decide to). Of course it's a really bad hack and I'm still hoping
>>> someone can point me to a better solution.
>>>
>>> Thanks
>>> Philippe.
>>>
>>>
>>> Le 29-05-2015 11:24, maitai a écrit :
>>> > I had a look at QT sources... Basically what I want to do is override
>>> > QIOSViewController:shouldAutorotate.
>>> >
>>> > I tried
>>> > @interface MyIOSViewController : QIOSViewController
>>> > @end
>>> > @implementation MyIOSViewController
>>> > - (BOOL) shouldAutorotate {
>>> >      NSLog(@"Inside shouldAutorotate");
>>> >      return NO;
>>> > }
>>> >
>>> > It compiles and does not crash (I import QIOSViewController.h), but
>>> > that
>>> > all it does...
>>> >
>>> >
>>> > Le 29-05-2015 10:23, Harri Pasanen a écrit :
>>> >> Compared to C++, Objective-C is very dynamic language and you can do
>>> >> many things at runtime.
>>> >>
>>> >> So you can add methods to existing classes using categories:
>>> >>
>>> https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/CustomizingExistingClasses/CustomizingExistingClasses.html
>>> >>
>>> >> Or resort to something quite funky to replace existing methods:
>>> >> https://github.com/rentzsch/jrswizzle
>>> >>
>>> >> As to your original question, rotation handling is surprisingly tricky
>>> >> even in pure Objective-C if you want to conditionally rotate.   For
>>> >> instance iOS 8.3 broke some of my code handling that which had worked
>>> >> fine since iOS 6, pure Objective-C.
>>> >>
>>> >> I don't know how Qt hooks into it.
>>> >>
>>> >> Harri
>>> >>
>>> >> On 29/05/2015 09:41, Robert Iakobashvili wrote:
>>> >>> On Fri, May 29, 2015 at 8:38 AM, maitai <maitai at virtual-winds.org>
>>> >>> wrote:
>>> >>>> Thanks Ben for your reply
>>> >>>>
>>> >>>> After much digging I made some progress but I am still looking for a
>>> >>>> way to
>>> >>>> temporary lock screen auto rotation.
>>> >>>>
>>> >>>> I have created my own app delegate to catch openUrl(), and
>>> >>>> surprisingly it
>>> >>>> works. I register my app delegate from main.cpp by calling something
>>> >>>> like
>>> >>>> this:
>>> >>>>
>>> >>>> void QtAppDelegateInitialize ()
>>> >>>>
>>> >>>> {
>>> >>>>
>>> >>>>      QtAppDelegate *appDelegate = (QtAppDelegate *)[[UIApplication
>>> >>>> sharedApplication] delegate];
>>> >>>>
>>> >>>>      [[UIApplication sharedApplication] setDelegate:[QtAppDelegate
>>> >>>> sharedQtAppDelegate]];
>>> >>>>
>>> >>>>      NSLog(@"Created a new appdelegate");
>>> >>>>
>>> >>>> }
>>> >>>>
>>> >>>>
>>> >>>>
>>> >>>> I then found this very interesting post:
>>> >>>>
>>> https://forum.qt.io/topic/48745/how-to-get-didfinishlaunchingwithoptions-called-in-ios-delegate/7
>>> >>>> which links to this bug report: QTBUG-38184.
>>> >>>>
>>> >>>> First question: I am now wondering how my delegate can possibly work
>>> >>>> since
>>> >>>> it seems I can have only one delegate... so what happened to
>>> >>>> QIOSApplicationDelegate?
>>> >>>>
>>> >>>> I then tried various things to add yet another delegate this time
>>> >>>> based on
>>> >>>> UINavigationControllerDelegate, but although after much sweat it
>>> >>>> seems to
>>> >>>> load, the various methods I am trying to override are never called
>>> >>>> when I
>>> >>>> rotate the device.
>>> >>>>
>>> >>>> Could it be that I should instead modify/interface
>>> >>>> QIOSApplicationDelegate
>>> >>>> itself and not try to create my own delegates?
>>> >>>>
>>> >>>> A bit confused at this point, I admit ;)
>>> >>>>
>>> >>>> Thanks for any tip
>>> >>>>
>>> >>>> Philippe Lelong
>>> >>>>
>>> >>>>
>>> >>>>
>>> >>>> Le 27-05-2015 20:24, Ben Lau a écrit :
>>> >>>>
>>> >>>>
>>> >>>>
>>> >>>> On 28 May 2015 at 02:07, maitai <maitai at virtual-winds.org> wrote:
>>> >>>>> Hello all,
>>> >>>>>
>>> >>>>> I've started to port on iOS and need to override some methods, like
>>> >>>>> we
>>> >>>>> do easily through Java on Qt/Android. I succeeded to implement an
>>> >>>>> appDelegate in objective-C that works for some events like openURL
>>> >>>>> and
>>> >>>>> such, but for instance I also need to lock automatic screen
>>> >>>>> rotation
>>> >>>>> in
>>> >>>>> some circumstances (but not always).
>>> >>>>
>>> >>>> Objective-C has a feature to replace the original method of a class.
>>> >>>> So you
>>> >>>> may just override the method you needed (In case it don't break Qt)
>>> >>>> Customizing Existing Classes
>>> >>>>
>>> >>>> Example Code:
>>> >>>> quickios/appdelegate.mm at 0b067e17dc13b8533ca3f7dd574d7e81ea17a015
>>> >>>> ·
>>> >>>> benlau/quickios
>>> >>>>
>>> >>>> I have tested to override openURL and didFinishLaunchingWithOptions
>>> >>>> of
>>> >>>> AppDelegate with Qt 5.4.1. This method works.
>>> >>>>
>>> >>>>> I read that I should somehow override "bool
>>> >>>>> UINavigationController::shouldRotate()"
>>> >>>>
>>> >>>> Never tried. But should be worth to try? I am also be interested
>>> >>>> with
>>> >>>> your
>>> >>>> result.
>>> >>>>
>>> >>>>> Should I reimp (subclass?) UINavigationController and how? Or is
>>> >>>>> there a
>>> >>>>> way to create a new delegate or even better to extend my current
>>> >>>>> appDelegate?
>>> >>>>>
>>> >>>>>
>>> >>>>> I'm new to Objective-C as you can guess... Any clue would be really
>>> >>>>> appreciated :)
>>> >>>>>
>>> >>>>> Thanks
>>> >>>>> Philippe Lelong
>>> >>> Dear Philippe,
>>> >>>
>>> >>> Please see the reply Tor Arne inside
>>> >>>
>>> >>> https://bugreports.qt.io/browse/QTBUG-42123
>>> >>>
>>> >>> That could be an answer - Let it be.
>>> >>>
>>> >>> Sincerely,
>>> >>> Robert
>>> >>> _______________________________________________
>>> >>> Interest mailing list
>>> >>> Interest at qt-project.org
>>> >>> http://lists.qt-project.org/mailman/listinfo/interest
>>> >>
>>> >> _______________________________________________
>>> >> Interest mailing list
>>> >> Interest at qt-project.org
>>> >> http://lists.qt-project.org/mailman/listinfo/interest
>>> > _______________________________________________
>>> > Interest mailing list
>>> > Interest at qt-project.org
>>> > http://lists.qt-project.org/mailman/listinfo/interest
>>> _______________________________________________
>>> Interest mailing list
>>> Interest at qt-project.org
>>> http://lists.qt-project.org/mailman/listinfo/interest
>>>
>>
>> _______________________________________________
>> Interest mailing list
>> Interest at qt-project.org
>> http://lists.qt-project.org/mailman/listinfo/interest
>>
>
> _______________________________________________
> Interest mailing list
> Interest at qt-project.org
> http://lists.qt-project.org/mailman/listinfo/interest
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/interest/attachments/20150529/f4b210f3/attachment.html>


More information about the Interest mailing list