RSS
czwartek, 11 lipca 2013
Programowanie iPhone – UITableiew blokowanie wierszy tabeli

 

Jednym ze sposobów uniemożliwienia użytkownikom naszej aplikacji wyboru jednego lub więcej wierszy tabeli (UITableView) jest implementacja w delegacie UITableViewDelegate metody tableview:willSelectRowAtIndexPath:. Wiersze, dla których metoda zwróci wartości nil będą „niewybieralne”.

 

-(NSIndexPath*)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {

   BOOL isRowSelectable = TRUE;  //domyslnie mozna wybrac wiersz
   //sprawdz czy wiersz moze byc wybrany czy nie
   
   //...
   
   if (isRowSelectable) {
      return indexPath;
   }
   
   return nil;
   
}

 

Warto też w metodzie (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath ustawić, dla wierszy których nie można wybrać parametr selectionStyle na UITableViewCellSelectionStyleNone:

 

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
   
   //...

   cell.selectionStyle = UITableViewCellSelectionStyleNone;
   return cell;
}

 

Opcjonalnie można również ustawić właściwość wiersza userInteractionEnabled na NO;

 

cell.userInteractionEnabled = NO;

 

Dzięki temu unikniemy chwilowego zmiany koloru komórki na niebieski w momencie gdy użytkownik na niej „tapnie”. Można tez pokusić się o stworzenie kategorii rozszerzającej możliwości klasy UITableViewCell.

wtorek, 09 lipca 2013
MacBook Pro Boot Camp i Print Screen

 

Przygotowując jeden z ostatnich wpisów musiałem wykonać print screena okna. Oczywiście na klawiaturze Maca klawisz Print Scrn nie istnieje.

Po krótkim poszukiwaniu znalazłem stronę Appla wyjaśniającą jak to zrobić:

 

Print Screen - cały ekran: Shift + Fn + F11
Print Screen - aktywne okno: Alt + Shift + Fn + F11

 

Nie jest to generalnie problem Boot Camp, ale ogólnie ograniczenie klawiatury MacBooka. Po podłączeniu do laptopa standardowej klawiatury Windows, wszystkie klawisze działają tak jak powinny.

Więcej przydatnych skrótów można znaleźć na stronach supportu Apple: http://support.apple.com/kb/HT1220.

środa, 03 lipca 2013
Wykorzystanie klas .NET w PowerBuilder 12.5 Classic

 

Wykorzystanie klas.NET w aplikacji PowerBuilder powinno być proste i takie też jest, jeśli pracujemy z wersja .NET PowerBuilder’a, w przypadku wersji Classic, musimy nasza klasę odpowiednio do tego przygotować i zarejestrować jako komponent COM.

Załóżmy, że chcemy wykorzystać w naszej aplikacji PB metodę Sum() poniższej klasy:


using System;
using System.Runtime.InteropServices;

namespace SHARP
{
    [Guid("A08260C7-6F2D-400B-82BD-5B768CD2C1A6")]
    [ComVisible(true)]
    public class SharpClass
    {
        public int Sum(int a, int b) {
            return a + b;
        }
    }
}

 

1. Przede wszystkim musimy wskazać, jakie elementy naszego assembly będą dostępne przez interfejs COM, w powyższym przykładzie jest to pojedyncza klasa SharpClass.

„Widoczność” COM może być również zdefiniowana na dwa sposoby, na poziomie całego assembly.

Pierwszy sposób to edycja pliku AssemblyInfo.cs:

AssemblyInfo.cs

//Setting ComVisible to false makes the types in this assembly not visible
//to COM components.  If you need to access a type in this assembly from
//COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(true)]


// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("c814a8fa-c35f-4306-b5e5-5b30f72ab21a")]


Zaletą tego podejścia jest to, iż nie musimy generować, w tym wypadku nowego identyfikatora GUID, będzie wykorzystany ten dostępny w pliku AssemblyInfo.cs.


„Widoczność” COM na poziomie assembly możemy również ustawić z wykorzystaniem adnotacji tak, jak pokazuje to poniższy przykład:


 

[assembly: System.Runtime.InteropServices.ComVisible(true)]
namespace SHARP
{
   ...
}

 

Tak jak poprzednio i w tym wypadku nie musimy generować nowego identyfikatora GUID.

UWAGA! „Widoczność” COM [ComVisible(true)] na poziomie assembly może być ustawiona tylko raz, bądź w pliku AssemblyInfo.cs, bądź z wykorzystaniem adnotacji. Podwoja deklaracja spowoduje błąd: “Duplicate 'ComVisible' attribute”.

 

Ostatnim sposobem jest udostepnienie przez interfejs COM pojedynczej klasy, tak jak pokazane to na pierwszym przykładzie (adnotacja przed definicja klasy). W tym jednak wypadku powinniśmy wygenerować nowy identyfikator GUID. W tym celu możemy wykorzystać narzędzie dostępne w Visual Studio - Create GUID (menu Tools)


Visual Studio - generowanie GUID

Visual Studio - generowanie GUID

 

2. Następnie musimy zaznaczyć opcje Register for COM interop, w ustawieniach Build/Output naszego projektu w Visual Studio.

Visual Studio - Register for COM interop

 

Po wybraniu tej opcji próba kompilacja bez wcześniejszego określenia, które z elementów assembly powinny być dostępne via COM spowoduje pojawienie się poniższego ostrzeżenia:

warning MSB3391: " SHARP.dll" does not contain any types that can be unregistered for COM Interop.


3. Teraz musimy zarejestrować nasze assembly:

c:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe /codebase c:\Temp\SHARP\SHARP\bin\Debug\SHARP.dll /regfile:SHARP.reg

W przypadku, gdy na komputerze, na którym pracujemy zainstalowane jest kilka wersji .NET najlepiej jest podać pełną ścieżkę dostępu do programu RegAsm.exe. Jeśli tego nie zrobimy, próba rejestracji może zakończyć się niepowodzeniem z błędem: “Failed to load .dll because it is not a valid .NET assembly” error:

c:\Temp\SHARP\SHARP\bin\Debug>REGASM SHARP.dll /regfile:SHARP.reg
Microsoft (R) .NET Framework Assembly Registration Utility 2.0.50727.5420
Copyright (C) Microsoft Corporation 1998-2004.  All rights reserved.

RegAsm : error RA0000 : Failed to load 'c:\Temp\SHARP\SHARP\bin\Debug\SHARP.dll' because it is not a valid .NET assembly

c:\Temp\SHARP\SHARP\bin\Debug>

4. Po zmodyfikowaniu rejestru (uruchomieniu utworzonego pliku .reg) możemy zacząć wykorzystywać nasza klasę w aplikacji PowerBuilder:

 

integer            li_rc
oleobject          sharp

sharp = CREATE oleobject
li_rc = sharp.ConnectToNewObject ( "SHARP.SharpClass" )
li_rc = sharp.Sum(5, 1)
sharp.DisconnectObject()
DESTROY sharp

 

Dużym minusem, przynajmniej dla mnie, jest fakt, że w momencie pierwszego wykorzystania klasy przez aplikacje PowerBuilder, pliki *.dll i *.tlb (SHARP.dll i SHARP.tlb) zostaną zablokowane i pozostaną zablokowane do momentu zamknięcia aplikacji, nawet pomimo wykonania polecenia DisconnectObject.

 

Wersja PB 12.5.1 Build 4595.

poniedziałek, 24 czerwca 2013
Visual Studio i nieczytelne bloki try...catch podczas debugowania

 

Ponieważ ostatnio sporo czasu spędzam w Visual Studio programując w C# doszedłem do wniosku, że korzystanie z domyślnych ustawień edytora (ciemne litery na jasnym tle) jest zbyt męczące dla oczu. Wybrałem więc jeden z wielu dostępnych ciemnych szablonów dla edytora Visual Studio - Moira (zmodyfikowana) i w zasadzie jestem ze zmiany bardzo zadowolony.

Problem pojawił się w momencie debugowania kody. Visual Studio uparcie podświetla cały blok try...catch powodując ze tekst staje się kompletnie nieczytelny.

Debugowanie bloku try...catch przed zmianą:
Blok try-catch przed zmianą 


Po krótkim eksperymentowaniu z ustawieniami (Tools/Options/Environment/Fonts And Colors) okazało się, że odpowiedzialne za to ustawienie jest pozycja “Read-Only Region”. Po zmianie wszystko wygląda znacznie lepiej (niekoniecznie jednak na ekranie ustawień :)

Blok try-catch ustawienia

 
Debugowanie bloku try...catch po zmianie:
Blok try-catch po zmianie

czwartek, 20 czerwca 2013
C# podstawowe operacje na plikach - ściąga

 

Poniżej kilka prostych przykładów w języku C# typowych operacji na plikach.

Zapisywanie teksu do pliku tak, aby plik był bądź utworzony, gdy nie istnieje, bądź jego zawartość nadpisana, gdy istnieje.

 

System.IO.File.WriteAllText(sciezka, zawartosc);

 

Odseparowanie nazwy pliku z pełnej ścieżki do pliku, z rozszerzeniem pliku i bez.


nazwa_pliku = System.IO.Path.GetFileName(plik_ze_sciezka);

nazwa_pliku = System.IO.Path.GetFileNameWithoutExtension(plik_ze_sciezka);


Usunięcie ostatniego znaku slash ze ścieżki, jeśli istnieje.



sciezka = sciezka.TrimEnd(System.IO.Path.DirecorySeparatorChar);

 

Utworzenie nowego katalogu, jeśli nie istnieje.

 

bool plikUtworzony = false;
try
{
   System.IO.File.WriteAllText(nazwa, zawartosc);
   plikUtworzony = true;
}
catch (System.IO.DirectoryNotFoundException)
{
   (new FileInfo(nazwa)).Directory.Create();
}
finally
{
   if (!plikUtworzony)
   {
      System.IO.File.WriteAllText(nazwa, zawartosc);
   }
}

czwartek, 13 czerwca 2013
Programowanie iPhone - nagrania wideo z sesji WWDC 2013

Apple, znacznie wcześniej niż zwykle (krążąca po sieci plotka okazała się wiec prawdziwa, choć nie do końca ;) udostępniło nagrania z sesji WWDC 2013 Apple Worldwide Developers Conference, konferencja ciągle trwa i nowe nagrania uaktualniane będą na bieżąco.

 

Nagrania dostępne są dla programistów zarejestrowanych programie Apple Developer Program.

Programowanie iPhone - Nagrania z sesji WWDC 2013

Blox - odzyskanie skasowanego wpisu

Dwa dni temu moja druga połówka, przypadkowo, porządkując kategorie skasowała kilka wpisów na swoim blogu http://caketime.blox.pl (kasując kategorie kasujesz wszystkie należące do niej wpisy). Blox nie oferuje opcji kosza, z którego usunięty przypadkowo wpis można by, odzyskać wiec musieliśmy z pomocą zwrócić się do Google.

 

Ponieważ Google archiwizuje indeksowane strony, wyszukiwarkę możemy wykorzystać do odzyskania naszych postów. Wystarczy w oknie wyszukiwarki wpisać nasz blox-owy login + site:link_d_bloga: 

anahitka9 site:caketime.blox.pl

 

Tak jak pokazuje to również poniższy ekran. W naszym wypadku, pamiętając tytuły usuniętych wpisów, wykorzystaliśmy je również do wyszukania interesujących nas stron.

 

caketime.blox.pl 

 

Ponieważ wpis już nie istniał, klikniecie na znalezionym przez Google linku przenosiło nas na główną stronę bloga. Aby zobaczyć i odzyskać faktyczny wpis, musieliśmy wykorzystać jego kopię klikając na małą strzałkę przy wpisie i wybierając Kopia (w przeglądarce z językiem angielskim Cached).

 

Oczywiście samo już przywrócenie wpisu polegało na skopiowaniu tekstu (zdjęcia na szczęście nie zginęły :) i utworzeniu nowego wpisu na bloxie.

 

caketime.blox.pl

 

Bez podania tytuły wpisu koniecznym byłoby przejście przez wiele, lub nawet wszystkie strony wyszukane przez Google. Możliwe jest również ze poszukiwany przez nas wpis nie znajduje się już w głównych rezultatach wyszukiwania Google, w takiej sytuacji wpisu musimy szukać pomiędzy stronami pominiętymi wtedy należy przejść na ostatnia stronę z rezultatami wyszukiwania i kliknąć w link powtórzenia wyszukiwania z uwzględnieniem pominiętych wyników.

 

Aby pokazać najbardziej trafne wyniki, pominęliśmy kilka pozycji bardzo podobnych do 420 już wyświetlonych.Jeśli chcesz, możesz powtórzyć wyszukiwanie z uwzględnieniem pominiętych wyników.

 

W przeglądarce z językiem angielskim będzie to wyglądało następująca:

 

In order to show you the most relevant results, we have omitted some entries very similar to the 418 already displayed. If you like, you can repeat the search with the omitted results included.

 

Tagi: blox
12:19, m0rt1m3r
Link Dodaj komentarz »
wtorek, 11 czerwca 2013
Programowanie iPhone - iOS7 Beta i nowa wersja Xcode 5 dostępne

 

Na stronach centrum deweloperów iOS Apple (iOS Developer Center) można pobrać wersje beta nowego systemu iOS 7, zapowiedzianą wczoraj podczas konferencji WWDC 2013, jak również nowe wersje środowiska programistycznego Xcode 5 Developer Preview.

 

czwartek, 06 czerwca 2013
Programowanie iPhone - jak wykonać określaną operację w aplikacji tylko raz

 

Operacje jak początkowa inicjalizacja parametrów naszej aplikacji, bądź kopiowanie plików roboczych (dostarczanych w application bundle, jako read only) w miejsce, w którym możliwa będzie ich modyfikacja są operacjami, które najczęściej wykonujemy tylko raz, podczas pierwszego uruchomienia aplikacji.

To czy nasza aplikacja została uruchomiona po raz pierwszy czy też nie możemy łatwo sprawdzić korzystając z klasy NSUserDefaults, tak jak pokazuje to poniższy kod (do umieszczenia w jednej z metod: application:willFinishLaunchingWithOptions: bądź application:didFinishLaunchingWithOptions:).

 

NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
if (! [defaults boolForKey:@"runOnce"]) {
  //kod do wykonania tylko raz...
  ...
  [defaults setBool:YES forKey:@"runOnce"];
}

 

Idea jest prosta, podczas pierwszego uruchomienia aplikacji sprawdza, czy klucz runOnce istnieje i czy jego wartość ustawiona jest na YES. Jeśli warunek nie jest spełniony, oznacza to, że nasz program uruchamiany jest po raz pierwszy i wykonywany jest odpowiedni kod. Na koniec klucza runOnce ustawiany jest na wartość YES, co sprawi, że przy kolejnym uruchomieniu nasz kod nie, będzie ponownie wykonany.

Dawniej po modyfikacjach instancji obiektu NSUserDefaults konieczne było wywołanie metody synchronize, aby trwale zapisać zmiany w bazie na naszym urządzenia. Obecnie metoda ta jest wykonywana automatycznie, co pewien czas przez system iOS.

Uwaga! Powyższe rozwiązanie nie sprawdzi się w wypadku, gdy chcemy, aby operacja wykonywana była po zaktualizowaniu naszej aplikacji. W takim wypadku konieczne jest zapisywanie numeru wersji naszego programu w bazie parametrów użytkownika, obsługiwanej przez klasę NSUserDefaults i porównywanie z faktyczna wersją uruchamianej aplikacji. Jeśli wersje się różnią, wykonać należy odpowiedni kod i zaktualizować wersję aplikacji w bazie parametrów.


O czym należy pamiętać, a o czym często autorzy aplikacji iOS zapominają, jest fakt, iż użytkownik może ‘przeskoczyć’ jedna, bądź nawet kilka wersji naszej aplikacji, co może prowadzić do krytycznych błędów wykonania. W takim wypadku konieczne jest, czasami krok po kroku, zaaplikowanie wszystkich zmian, niezbędnych do poprawnego działania nie tylko najnowszej wersji programu, ale też i wszystkich wcześniejszych nieinstalowanych uprzednio na urządzeniu użytkownika.

poniedziałek, 13 maja 2013
Aplikacja iPhone Eco Drive - śledzenie trasy

 

W ciągu ostatnich paru dni otrzymałem kila maili z prośbą o opisanie nowego ekranu aplikacji Eco Drive umożliwiającego śledzenie i rejestracji trasy, którą się obecnie poruszamy.

 

Opis wszystkich funkcji i opcji znajdziecie poniżej:


 

Aplikacja iPhone Eco Drive - śledzenie trasy

 

Uwaga dostępność pokazanych wyżej przycisków zleży zarówno od aktualnego trybu pracy jak i od wybranych opcji.

 

1.

Przycisk Start / Stop odpowiadający za rozpoczęcie i zakończenie śledzenia / rejestracji trasy.

2.

Blokowanie / odblokowanie przyciemniania, a następnie kompletnego wyłączenia ekranu iPhone w momencie, gdy nie używamy naszego urządzenia. Funkcja może być przydatna, gdy chcemy aby ekran naszego telefonu był stale widoczny.

Oczywiście z włączona blokadą czas pracy baterii naszego telefonu będzie krótszy.

Jeśli, po włączeniu blokady przełączamy się pomiędzy aplikacjami, a następnie wrócimy do ekranu śledzenia trasy Eco Drive, koniecznym okazać się może ponowne jej włączenie, ponieważ niektóre aplikacje mogą wyłączyć blokadę automatycznie w momencie, gdy są uruchamiane.

3.

Włączenie / wyłączenie rotacji wyświetlanej mapy zgodnie z kierunkiem poruszania się.

4.

Ustawienia funkcji „Route Tracking” (dokładny opis poniżej).

5.

Niebieską linią oznaczana jest trasa, po której się poruszamy (zobacz również ustawienia funkcji „Route Tracking” poniżej).

6.

Parametry poruszania się widoczne jedynie, gdy znajdujemy się w trybie śledzenia / rejestracji trasy. Aktualnie dostępne są dwa widoki parametrów poruszania się: jeden wyświetlający jedynie prędkość i drugi wyświetlający dodatkowo współrzędne geograficzne, kierunek poruszania się, przebyty dystans, oraz wysokość nad poziomem morza. Podwójne tapnięcie na aktualnie wyświetlanym widoku powoduje zmianę na drugi. Domyślny widok parametrów poruszania się można wybrać w opcjach funkcji „Route Tracking” - opcja: „Miscellaneous/Show speed only".

Znany bug: W momencie, gdy opcja „Show speed only" nie jest włączona przełączenie na nią trybie śledzenia / rejestracji trasy spowoduje ze prędkość nie będzie wyświetlana poprawnie. Bug zostanie usunięty w kolejnej wersji.


7.

Eksport zarejestrowanych danych przez email (zobacz również ustawienia funkcji „Route Tracking” poniżej).

8.

Zmiana typu mapy. Dostępne są następujące typy map: normalna - Map View (jak na ekranie powyżej), mapa satelitarna oraz hybrydowa.

9.

Rejestracja punku POI (point of interest).

10.

Przejście do ekranu zarządzania zarejestrowanymi trasami i punktami POI.

 

11.

Zresetowanie wyświetlanej trasy.

12.

Pauza. Tymczasowo zatrzymuje śledzenie / rejestrację trasy do momentu ponownego wciśnięcia.

 

Ustawienia funkcji „Route Tracking”

 

Route

1. Store route points [ON|OFF]. Włączenie / wyłączenie zapisywania trasy w bazie danych aplikacji. Zapisane dane mogą być następnie wyeksportowane z wykorzystaniem emaila.
2. Draw on map (BETA) [ON|OFF]. Włączenie / wyłączenie rysowania trasy, po której się poruszamy na mapie (funkcjonalność w wersji beta).

 

Export Route/POI(s)

1. CSV Format. Eksport zapisanych danych w formacje CSV. W trybie tym eksportowane są następujące informacje:

- identyfikator punktu (wewnętrzny),
- typ punktu (P - POI, R - punkt na trasie),
- identyfikator trasy (wewnętrzny),
- współrzędne geograficzne (długość i szerokość) punktu,
- dystans w metrach,
- prędkość w m/s,
- wysokość nad poziomem morza w metrach,
- kierunek poruszania się,
- data rejestracji w dwóch formatach,
- nazwa,
- notka,

Oraz obecnie niewykorzystywane:

- Speed Alert (POI),
- Speed Alert Note (POI)

2. Garmin’s POI format. Eksport danych w formacje CSV zgodnym z formatem POI nawigacji Garmin. Przykładowe dane poniżej:

8.218265,47.182376,["][@]["],["]POI's Comment["]
14.183534,52.350950,["][@]["],["]POI's Comment["]
18.628316,53.429343,["][@]["],["]POI's Comment["]

 3.

Export POIs only [ON|OFF]. W przypadku, gdy opcja ta jest ustawiona - ON - eksportowane będą jedynie zarejestrowane punkty POI.

 

Miscellaneous

1. Show speed only. Ustawia domyślny widok parametrów poruszania się na “wyświetlaj jedynie prędkość” widok ten można w każdej chwili zmienić za pomocą podwójnego tapnięcia.

2. Track in background. Włącza śledzenie / rejestrację trasy również, gdy aplikacja nie jest aktywna, znajduje się w tak zwanym „background mode”. Aktywacja tego trybu zwiększa zużycie baterii. 

3. Immediate POI edit. Włącza ekran podglądu / edycji parametrów POI niezwłocznie po dodaniu nowego punktu.

4. Immediate Route edit. Włącza ekran podglądu / edycji parametrów trasy niezwłocznie po zakończeniu jej rejestracji (Stop).

5. Delete all stored points. Usuwa z bazy danych aplikacji wszystkie uprzednio zarejestrowane trasy i punkty POI. Operacja ta jest operacją nieodwracalną.

 

GPS Accuracy

W sekcji tej możemy zmienić dokładność, z jaka będą rejestrowane punkty. Dostępne jest 6 następujących ustawień (od najdokładniejszego do najmniej dokładnego). Im większa dokładność śledzenia GPS tym większe zużycie baterii.

1. For Navigation
2. Best
3. Nearest Ten Meters 
4. Hundred Meters 
5. Kilometer 
6. Three Kilometers 
1 , 2 , 3 , 4 , 5 ... 16
Tagi




PowerBuilder Tetris
D - Tetris



Programowanie iOS

C# ToolBox

SQL / TSQL / PLSQL ToolBox

Linux / Unix ToolBox





Zaprzyjaznione Strony

Sprite Bandits

Cake Time