iOS Question Solved: Localizator show error in my app

tsteward

Well-Known Member
Licensed User
Longtime User
Not sure what is causing my app to crash but debugger is showing it's something I'm doing with localizator.

Hoping someone might have a clue for me.

Thank you!
*** page oem: B4XPage_Created [mainpage, page main2]
*** page oem: B4XPage_Resize [mainpage, page main2, page oem]
Error occurred on line: 69 (Localizator)
*** -[__NSPlaceholderArray initWithObjects:count:]: attempt to insert nil object from objects[26]
Stack Trace: (
CoreFoundation 0013A8B1-2524-3534-B5BA-681AAF18C798 + 185864
libobjc.A.dylib objc_exception_throw + 88
CoreFoundation 0013A8B1-2524-3534-B5BA-681AAF18C798 + 77428
CoreFoundation 0013A8B1-2524-3534-B5BA-681AAF18C798 + 81884
LARA5 -[ResumableSub_b4xpageoem_LoadOEM resume::] + 3808
CoreFoundation 0013A8B1-2524-3534-B5BA-681AAF18C798 + 196148
CoreFoundation 0013A8B1-2524-3534-B5BA-681AAF18C798 + 192124
LARA5 +[B4I runDynamicMethod:method:throwErrorIfMissing:args:] + 1352
LARA5 -[B4IShell runMethod:] + 420
LARA5 -[B4IShell raiseEventImpl:method:args::] + 1472
LARA5 -[B4IShellBI raiseEvent:event:params:] + 1360
LARA5 -[B4IDelegatableResumableSub resume::] + 376
LARA5 -[B4I checkAndRunWaitForEvent:event:params:] + 468
LARA5 -[B4IShellBI raiseEvent:event:params:] + 1216
LARA5 __37-[B4ICommon ReturnFromResumableSub::]_block_invoke + 256
libdispatch.dylib C05E486D-81F2-367E-9CE1-E14573C4C268 + 8776
libdispatch.dylib C05E486D-81F2-367E-9CE1-E14573C4C268 + 16296
libdispatch.dylib C05E486D-81F2-367E-9CE1-E14573C4C268 + 76340
libdispatch.dylib _dispatch_main_queue_callback_4CF + 44
CoreFoundation 0013A8B1-2524-3534-B5BA-681AAF18C798 + 498636
CoreFoundation 0013A8B1-2524-3534-B5BA-681AAF18C798 + 483776
CoreFoundation CFRunLoopRunSpecific + 588
GraphicsServices GSEventRunModal + 164
UIKitCore 8CC54497-F7EC-3903-AE5A-A274047C0CF1 + 4122228
UIKitCore UIApplicationMain + 340
LARA5 main + 100
dyld A770FF8C-8FB9-3E03-85FE-7F26DB36812B + 196072
)
 

tsteward

Well-Known Member
Licensed User
Longtime User
Sure here you go.

B4X:
Public Sub LoadOEM(OEMPartNum As String)
    B4XPages.MainPage.oemflist1 = File.ListFiles(B4XPages.MainPage.oemImagesDir)
    Dim oemhtml,fccid As String = ""
    B4XPages.MainPage.OEMPartNumber = OEMPartNum
    
    Dim rsOem As ResultSet = Main.sql1.ExecQuery($"SELECT * FROM OEMKeyRemote WHERE PartNum = '${OEMPartNum}'"$)
    Do While rsOem.NextRow
        Wait For(fixImageName(rsOem.GetString("Image"))) complete(fname As String)
        oemhtml = $"<h1>${rsOem.GetString("PartNum")}</h1><p><img src="${fname}" alt="" width="150" /></p>"$
        
        oemhtml = oemhtml & $"<ul><li>${B4XPages.MainPage.loc.Localize("Frequency")}: ${rsOem.GetString("Frequency")}</li>
        <li>FCCID: ${rsOem.GetString("FCCID")}</li>
        <li>${B4XPages.MainPage.loc.Localize("Transponder")}: ${rsOem.GetString("Transponder")}</li>
        <li>${B4XPages.MainPage.loc.Localize("Battery")}: ${rsOem.GetString("Battery")}</li>
        <li>${B4XPages.MainPage.loc.Localize("Qty Buttons")}: ${rsOem.GetString("QtyButtons")}</li>
        <li>${B4XPages.MainPage.loc.Localize("Proximity")}: ${rsOem.GetString("Prox")}</li>"$
        If rsOem.GetString("Other") <> Null Then
            oemhtml = oemhtml & rsOem.GetString("Other")
        End If
        oemhtml = oemhtml & "</ul>"
        If rsOem.GetString("Other2") <> Null Then
            oemhtml = oemhtml & rsOem.GetString("Other2")
        End If
        Dim autel As String = ""
        If rsOem.GetString("AutelUniversal") = Null Then
            autel = "?"
        Else
            autel = rsOem.GetString("AutelUniversal")
        End If
        Dim KeyDIY As String = ""
        If rsOem.GetString("KeyDIY") = Null Then
            KeyDIY = "?"
        Else
            KeyDIY = rsOem.GetString("KeyDIY")
        End If
        Dim VVDI As String = ""
        If rsOem.GetString("VVDI") = Null Then
            VVDI = "?"
        Else
            VVDI = rsOem.GetString("VVDI")
        End If
        
        
        oemhtml = oemhtml & $"<table style="text-align: left;" border="1" cellpadding="2" cellspacing="2"><tbody>
        <tr><td style="vertical-align: top;">Autel Universal</td><td style="vertical-align: top;">${autel}</td></tr>
        <tr><td style="vertical-align: top;">Key DIY</td><td style="vertical-align: top;">${KeyDIY}</td></tr>
        <tr><td style="vertical-align: top;">Xhorse</td><td style="vertical-align: top;">${VVDI}</td></tr>
        </tbody></table><br>"$
        fccid = rsOem.GetString("FCCID")
    Loop
    rsOem.Close
    '***** lara cars *****
    Dim rsVehicles As ResultSet = Main.sql1.ExecQuery($"SELECT * FROM Vehicles WHERE Transponder LIKE '%${OEMPartNum}%' OR RemoteID like '%${OEMPartNum}%'"$)
    oemhtml = oemhtml & $"<br><h3>${B4XPages.MainPage.loc.Localize("Vehicles in LARA using this")}:</h3><ul>"$
    Do While rsVehicles.NextRow
        'note = note & "<li><a href='www.vehicle." & rsVehicles.GetString("VehicleID") & "'>" & rsVehicles.GetString("Model") & "</a></li>"
        oemhtml = oemhtml & "<li><a href='www.vehicle." & rsVehicles.GetString("VehicleID") & "'>" & B4XPages.MainPage.Routines.getVehicleMake(rsVehicles.GetInt("MakeID")) & "  " & rsVehicles.GetString("Model") & "</a></li>"
    Loop
    rsVehicles.Close
    oemhtml = oemhtml & "</ul>"
    '***** KD *****
    Dim rsKeyDiy As ResultSet = Main.sql1.ExecQuery($"SELECT * FROM KeyDiy WHERE fccid LIKE '%${fccid}%' OR partNo LIKE '%${fccid}%'"$)
    oemhtml = oemhtml & $"<br><h3>${B4XPages.MainPage.loc.Localize("Profiles in Key DIY using the same FCCID")}</h3><ul>"$
    Do While rsKeyDiy.NextRow
        oemhtml = oemhtml & "<li>" & rsKeyDiy.GetString("partNo") & "   " & rsKeyDiy.GetString("frequency") & " " & rsKeyDiy.GetString("modulation") & "</li>"
    Loop
    rsKeyDiy.Close
    oemhtml = oemhtml & "</ul>"
    
    #if b4a
    ProgressDialogShow2($"${B4XPages.MainPage.loc.Localize("Checking for Feedback")}..."$,False)
    #else if b4i
    hd.ProgressDialogShow("Checking for Feedback...")
    #End If
    
    'Load Feedback
    Dim fbData As String = ""
    Dim j As HttpJob
    #if b4a
    ProgressDialogShow2($"${B4XPages.MainPage.loc.Localize("Checking for Feedback")}..."$,False)
    #else if b4i
    hd.ProgressDialogShow("Checking for Feedback...")
    #End If
    
    j.Initialize("", Me)
    #if b4a
    j.Download2(B4XPages.MainPage.Routines.svr & Main.getRemoteInfo, Array As String ("Action", "getOEMFeedback","partNum",B4XPages.MainPage.OEMPartNumber,"Mail",B4XPages.MainPage.Options1.Get("UserName"),"PWrd",B4XPages.MainPage.options1.Get("UserPassword"),"LaraVers",Application.VersionCode))
    #else if b4i
    j.Download2(B4XPages.MainPage.Routines.svr & Main.getRemoteInfo, Array As String ("Action", "getOEMFeedback","partNum",B4XPages.MainPage.OEMPartNumber,"Mail",B4XPages.MainPage.Options1.Get("UserName"),"PWrd",B4XPages.MainPage.options1.Get("UserPassword"),"LaraVers",Main.VersionCode))
    #End If
    j.GetRequest.Timeout = Main.reqTimeout
    Wait For (j) JobDone(j As HttpJob)
    If j.Success Then
        Dim res As String
        Dim pos,neg As Int
        pos = 0
        neg = 0
        Dim parser As JSONParser
        res = j.GetString
        If res.Contains("Update LARA") Then
            xui.MsgboxAsync(B4XPages.MainPage.loc.Localize("Your version of LARA needs updating to work"),B4XPages.MainPage.loc.Localize("Error!"))
        else if res.Contains("Not Registered") Then
            xui.MsgboxAsync(B4XPages.MainPage.loc.Localize("You are not registered or not logged in properly"),B4XPages.MainPage.loc.Localize("Error!"))
        Else
            LogColor(res,Colors.Blue)
            parser.Initialize(res)
            Dim ListOfFeedback As List
            ListOfFeedback = parser.NextArray 'returns a list with maps
            'Log("List size - " & ListOfFeedback.Size)
            fbData = "<br><h2>" & B4XPages.MainPage.loc.Localize("User Feedback") & " (" & ListOfFeedback.Size & ")</h2>"
            Dim colourLoop As Int
            Dim mycolour As String
            colourLoop = 1
            If ListOfFeedback.Size>0 Then
                For i = 0 To ListOfFeedback.Size - 1
                    Dim retcode As Map
                    retcode = ListOfFeedback.Get(i)
                    pos = retcode.Get("Positive")
                    'Log("Pos - " & retcode.Get("Positive"))
                    neg = retcode.Get("Negitive")
                    'Log("neg - " & retcode.Get("Negitive"))
                    If colourLoop = 1 Then
                        mycolour = "lavender"
                        colourLoop = 2
                    Else
                        colourLoop = 1
                        mycolour = "lightcyan"
                    End If
                
                    fbData = fbData & "<table style='text-align: left; width: 100%;' border='1' cellpadding='2' cellspacing='2'>"
                    fbData = fbData & "<tbody>"
                    fbData = fbData & "<tr>"
                    fbData = fbData & "<td bgcolor='" & mycolour & "'>"
                    fbData = fbData & retcode.Get("Feedback") & "<br>"
                    fbData = fbData & B4XPages.MainPage.Routines.feedbackTable(fbData.Contains(B4XPages.MainPage.Options1.Get("UserName")), retcode.Get("FeedbackID"),"OEM", pos, neg)
                    
                    fbData = fbData & "</td></tr>"
                    '****Start chat***
                    Dim tttemp As String
                    tttemp = retcode.Get("Comments")
                    tttemp = B4XPages.MainPage.Routines.CleanChatMessage(tttemp)
                    fbData = fbData & B4XPages.MainPage.Routines.addChat(retcode.Get("FeedbackID"), "oemChat", mycolour, tttemp)
                    fbData = fbData & "</tbody>"
                    fbData = fbData & "</table><br>"
                Next
            End If
            fbData = B4XPages.MainPage.Routines.HandleAllTags(fbData)
        End If
    Else
        fbData = $"<h2>${B4XPages.MainPage.loc.Localize("User Feedback Unavailable at this time")}</h2>"$
    End If
    j.Release
    oemhtml = oemhtml & fbData
    #if b4a
    ProgressDialogHide
    #else if b4i
    hd.ProgressDialogHide
    #End If
    oemhtml = B4XPages.MainPage.Routines.HandleAllTags(oemhtml)
    
    wvOEM.LoadHtml(B4XPages.MainPage.Routines.addHTMLHeader("") & oemhtml)
    
End Sub
 
Upvote 0

Erel

B4X founder
Staff member
Licensed User
Longtime User
Why do you need to call fiximagename with Wait For? This is just a guess - but it might be better to read all values from the ResultSet and only then call Wait For.

The way to debug this is by adding a few log messages and then clean the project (Ctrl + P) to force the debugger to make a full deployment. Maybe one of the strings is missing in the localizator and it causes something to break.
 
Upvote 0

tsteward

Well-Known Member
Licensed User
Longtime User
Thanks for your help.
Turned out my not checking for a null when requesting data was crashing the app.
Not sure why this showed up in localizator but turned out it had nothing to do with it.
 
Upvote 0
Top